diff options
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/tools/qtimezone.cpp | 899 | ||||
-rw-r--r-- | src/corelib/tools/qtimezone.h | 162 | ||||
-rw-r--r-- | src/corelib/tools/qtimezoneprivate.cpp | 643 | ||||
-rw-r--r-- | src/corelib/tools/qtimezoneprivate_data_p.h | 1122 | ||||
-rw-r--r-- | src/corelib/tools/qtimezoneprivate_p.h | 198 | ||||
-rw-r--r-- | src/corelib/tools/tools.pri | 5 |
6 files changed, 3029 insertions, 0 deletions
diff --git a/src/corelib/tools/qtimezone.cpp b/src/corelib/tools/qtimezone.cpp new file mode 100644 index 0000000000..a739d9c69f --- /dev/null +++ b/src/corelib/tools/qtimezone.cpp @@ -0,0 +1,899 @@ +/**************************************************************************** +** +** Copyright (C) 2013 John Layt <jlayt@kde.org> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include "qtimezone.h" +#include "qtimezoneprivate_p.h" + +#include <QtCore/qdatetime.h> + +#include <qdebug.h> + +QT_BEGIN_NAMESPACE + +// Create default time zone using appropriate backend +static QTimeZonePrivate *newBackendTimeZone() +{ + return new QUtcTimeZonePrivate(); +} + +// Create named time zone using appropriate backend +static QTimeZonePrivate *newBackendTimeZone(const QByteArray &olsenId) +{ + return new QUtcTimeZonePrivate(olsenId); +} + +class QTimeZoneSingleton +{ +public: + QTimeZoneSingleton() : backend(newBackendTimeZone()) {} + + // The backend_tz is the tz to use in static methods such as availableTimeZoneIds() and + // isTimeZoneIdAvailable() and to create named Olsen time zones. This is usually the host + // system, but may be different if the host resources are insufficient or if + // QT_NO_SYSTEMLOCALE is set. A simple UTC backend is used if no alternative is available. + QSharedDataPointer<QTimeZonePrivate> backend; +}; + +Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz); + +/*! + \class QTimeZone + \inmodule QtCore + \since 5.2 + \brief The QTimeZone class converts between between UTC and local time in a + specific time zone. + + \threadsafe + + This class provides a stateless calculator for time zone conversions + between UTC and the local time in a specific time zone. By default it uses + the host system time zone data to perform these conversions. + + This class is primarily designed for use in QDateTime; most applications + will not need to access this class directly and should instead use + QDateTime with a Qt::TimeSpec of Qt::TimeZone. + + \note For consistency with QDateTime, QTimeZone does not account for leap + seconds. + + \section1 + + \section2 Olsen Time Zone IDs + + QTimeZone uses the Olsen time zone IDs as defined in the IANA Time Zone + Database (http://www.iana.org/time-zones). This is to ensure a standard ID + across all supported platforms. Most platforms support the Olsen IDs + and the IANA Database natively, but for Windows a mapping is required to + the native IDs. See below for more details. + + The Olsen IDs can and do change on a regular basis, and can vary depending + on how recently the host system data was updated. As such you cannot rely + on any given ID existing on any host system. You must use + availableTimeZoneIds() to determine what Olsen IDs are available. + + \section2 UTC Offset Time Zones + + A default UTC time zone backend is provided which is always guaranteed to + be available. This provides a set of generic Offset From UTC time zones + in the range UTC-14:00 to UTC+14:00. These time zones can be created + using either the standard ISO format names "UTC+00:00" as listed by + availableTimeZoneIds(), or using the number of offset seconds. + + \section2 Windows Time Zones + + Windows native time zone support is severely limited compared to the + standard IANA TZ Database. Windows time zones cover larger geographic + areas and are thus less accurate in their conversions. They also do not + support as much historic conversion data and so may only be accurate for + the current year. + + QTimeZone uses a conversion table derived form the Unicode CLDR data to map + between Olsen IDs and Windows IDs. Depending on your version of Windows + and Qt, this table may not be able to provide a valid conversion, in which + "UTC" will be returned. + + QTimeZone provides a public API to use this conversion table. The Windows ID + used is the Windows Registry Key for the time zone which is also the MS + Exchange EWS ID as well, but is different to the Time Zone Name (TZID) and + COD code used by MS Exchange in versions before 2007. + + \section2 System Time Zone + + QTimeZone does not support any concept of a system or default time zone. + If you require a QDateTime that uses the current system time zone at any + given moment then you should use a Qt::TimeSpec of Qt::LocalTime. + + The method systemTimeZoneId() returns the current system Olsen time zone + ID which on OSX and Linux will always be correct. On Windows this ID is + translated from the the Windows system ID using an internal translation + table and the user's selected country. As a consequence there is a small + chance any Windows install may have IDs not known by Qt, in which case + "UTC" will be returned. + + Creating a new QTimeZone instance using the system time zone ID will only + produce a fixed named copy of the time zone, it will not change if the + system time zone changes. + + \section2 Time Zone Offsets + + The difference between UTC and the local time in a time zone is expressed + as an offset in seconds from UTC, i.e. the number of seconds to add to UTC + to obtain the local time. The total offset is comprised of two component + parts, the standard time offset and the daylight time offset. The standard + time offset is the number of seconds to add to UTC to obtain standard time + in the time zone. The daylight time offset is the number of seconds to add + to the standard time offset to obtain daylight time in the time zone. + + Note that the standard and daylight offsets for a time zone may change over + time as countries have changed daylight time laws or even their standard + time offset. + + \section2 License + + This class includes data obtained from the CLDR data files under the terms + of the Unicode license. + + \legalese + COPYRIGHT AND PERMISSION NOTICE + + Copyright © 1991-2012 Unicode, Inc. All rights reserved. Distributed under + the Terms of Use in http://www.unicode.org/copyright.html. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of the Unicode data files and any associated documentation (the "Data + Files") or Unicode software and any associated documentation (the "Software") + to deal in the Data Files or Software without restriction, including without + limitation the rights to use, copy, modify, merge, publish, distribute, and/or + sell copies of the Data Files or Software, and to permit persons to whom the + Data Files or Software are furnished to do so, provided that (a) the above + copyright notice(s) and this permission notice appear with all copies of the + Data Files or Software, (b) both the above copyright notice(s) and this + permission notice appear in associated documentation, and (c) there is clear + notice in each modified Data File or in the Software as well as in the + documentation associated with the Data File(s) or Software that the data or + software has been modified. + \endlegalese + + \sa QDateTime +*/ + +/*! + \enum QTimeZone::TimeType + + The type of time zone time, for example when requesting the name. In time + zones that do not apply daylight time, all three values may return the + same result. + + \value StandardTime + The standard time in a time zone, i.e. when Daylight Savings is not + in effect. + For example when formatting a display name this will show something + like "Pacific Standard Time". + \value DaylightTime + A time when Daylight Savings is in effect. + For example when formatting a display name this will show something + like "Pacific daylight time". + \value GenericTime + A time which is not specifically Standard or Daylight time, either + an unknown time or a neutral form. + For example when formatting a display name this will show something + like "Pacific Time". +*/ + +/*! + \enum QTimeZone::NameType + + The type of time zone name. + + \value DefaultName + The default form of the time zone name, e.g. LongName, ShortName or OffsetName + \value LongName + The long form of the time zone name, e.g. "Central European Time" + \value ShortName + The short form of the time zone name, usually an abbreviation, e.g. "CET" + \value OffsetName + The standard ISO offset form of the time zone name, e.g. "UTC+01:00" +*/ + +/*! + \class QTimeZone::OffsetData + \inmodule QtCore + + The time zone offset data for a given moment in time, i.e. the time zone + offsets and abbreviation to use at that moment in time. + + \list + \li OffsetData::atUtc The datetime of the offset data in UTC time. + \li OffsetData::offsetFromUtc The total offset from UTC in effect at the datetime. + \li OffsetData::standardTimeOffset The standard time offset component of the total offset. + \li OffsetData::daylightTimeOffset The daylight time offset component of the total offset. + \li OffsetData::abbreviation The abbreviation in effect at the datetime. + \endlist + + For example, for time zone "Europe/Berlin" the OffsetDate in standard and daylight time might be: + + \list + \li atUtc = QDateTime(QDate(2013, 1, 1), QTime(0, 0, 0), Qt::UTC) + \li offsetFromUtc = 3600 + \li standardTimeOffset = 3600 + \li daylightTimeOffset = 0 + \li abbreviation = "CET" + \endlist + + \list + \li atUtc = QDateTime(QDate(2013, 6, 1), QTime(0, 0, 0), Qt::UTC) + \li offsetFromUtc = 7200 + \li standardTimeOffset = 3600 + \li daylightTimeOffset = 3600 + \li abbreviation = "CEST" + \endlist +*/ + +/*! + \typedef QTimeZone::OffsetDataList + \relates QTimeZone + + Synonym for QList<OffsetData>. +*/ + +/*! + Create a null/invalid time zone instance. +*/ + +QTimeZone::QTimeZone() + : d(0) +{ +} + +/*! + Creates an instance of the requested time zone \a olsenId. + + The ID must be one of the available system IDs otherwise an invalid + time zone will be returned. + + \sa availableTimeZoneIds() +*/ + +QTimeZone::QTimeZone(const QByteArray &olsenId) +{ + // Try and see if it's a valid UTC offset ID, just as quick to try create as look-up + d = new QUtcTimeZonePrivate(olsenId); + // If not a valid UTC offset ID then try create it with the system backend + // Relies on backend not creating valid tz with invalid name + if (!d->isValid()) + d = newBackendTimeZone(olsenId); +} + +/*! + Creates an instance of a time zone with the requested Offset from UTC of + \a offsetSeconds. + + The \a offsetSeconds from UTC must be in the range -14 hours to +14 hours + otherwise an invalid time zone will be returned. +*/ + +QTimeZone::QTimeZone(int offsetSeconds) +{ + // offsetSeconds must fall between -14:00 and +14:00 hours + if (offsetSeconds >= -50400 && offsetSeconds <= 50400) + d = new QUtcTimeZonePrivate(offsetSeconds); + else + d = 0; +} + +/*! + Creates a custom time zone with an ID of \a olsenId and an offset from UTC + of \a offsetSeconds. The \a name will be the name used by displayName() + for the LongName, the \a abbreviation will be used by displayName() for the + ShortName and by abbreviation(), and the optional \a country will be used + by country(). The \a comment is an optional note that may be displayed in + a GUI to assist users in selecting a time zone. + + The \a olsenId must not be one of the available system IDs returned by + availableTimeZoneIds(). The \a offsetSeconds from UTC must be in the range + -14 hours to +14 hours. + + If the custom time zone does not have a specific country then set it to the + default value of QLocale::AnyCountry. +*/ + +QTimeZone::QTimeZone(const QByteArray &olsenId, int offsetSeconds, const QString &name, + const QString &abbreviation, QLocale::Country country, const QString &comment) +{ + // olsenId must be a valid ID and must not clash with the standard system names + if (QTimeZonePrivate::isValidId(olsenId) && !availableTimeZoneIds().contains(olsenId)) + d = new QUtcTimeZonePrivate(olsenId, offsetSeconds, name, abbreviation, country, comment); + else + d = 0; +} + +/*! + \internal + + Private. Create time zone with given private backend +*/ + +QTimeZone::QTimeZone(QTimeZonePrivate &dd) + : d(&dd) +{ +} + +/*! + Copy constructor, copy \a other to this. +*/ + +QTimeZone::QTimeZone(const QTimeZone &other) + : d(other.d) +{ +} + +/*! + Destroys the time zone. +*/ + +QTimeZone::~QTimeZone() +{ +} + +/*! + Assignment operator, assign \a other to this. +*/ + +QTimeZone &QTimeZone::operator=(const QTimeZone &other) +{ + d = other.d; + return *this; +} + +/*! + Returns true if this time zone is equal to the \a other time zone. +*/ + +bool QTimeZone::operator==(const QTimeZone &other) const +{ + if (d && other.d) + return (*d == *other.d); + else + return (d == other.d); +} + +/*! + Returns true if this time zone is not equal to the \a other time zone. +*/ + +bool QTimeZone::operator!=(const QTimeZone &other) const +{ + if (d && other.d) + return (*d != *other.d); + else + return (d != other.d); +} + +/*! + Returns true if this time zone is valid. +*/ + +bool QTimeZone::isValid() const +{ + if (d) + return d->isValid(); + else + return false; +} + +/*! + Returns the Olsen ID for the time zone. + + Olsen IDs are used on all platforms. On Windows these are translated + from the Windows ID into the closest Olsen ID for the time zone and country. +*/ + +QByteArray QTimeZone::id() const +{ + if (d) + return d->id(); + else + return QByteArray(); +} + +/*! + Returns the country for the time zone. +*/ + +QLocale::Country QTimeZone::country() const +{ + if (isValid()) + return d->country(); + else + return QLocale::AnyCountry; +} + +/*! + Returns any comment for the time zone. + + A comment may be provided by the host platform to assist users in + choosing the correct time zone. Depending on the platform this may not + be localized. +*/ + +QString QTimeZone::comment() const +{ + if (isValid()) + return d->comment(); + else + return QString(); +} + +/*! + Returns the localized time zone display name at the given \a atDateTime + for the given \a nameType in the given \a locale. The \a nameType and + \a locale requested may not be supported on all platforms, in which case + the best available option will be returned. + + If the \a locale is not provided then the application default locale will + be used. + + The display name may change depending on daylight time or historical + events. + + \sa abbreviation() +*/ + +QString QTimeZone::displayName(const QDateTime &atDateTime, NameType nameType, + const QLocale &locale) const +{ + if (isValid()) + return d->displayName(atDateTime.toMSecsSinceEpoch(), nameType, locale); + else + return QString(); +} + +/*! + Returns the localized time zone display name for the given \a timeType + and \a nameType in the given \a locale. The \a nameType and \a locale + requested may not be supported on all platforms, in which case the best + available option will be returned. + + If the \a locale is not provided then the application default locale will + be used. + + Where the time zone display names have changed over time then the most + recent names will be used. + + \sa abbreviation() +*/ + +QString QTimeZone::displayName(TimeType timeType, NameType nameType, + const QLocale &locale) const +{ + if (isValid()) + return d->displayName(timeType, nameType, locale); + else + return QString(); +} + +/*! + Returns the time zone abbreviation at the given \a atDateTime. The + abbreviation may change depending on daylight time or even + historical events. + + Note that the abbreviation is not guaranteed to be unique to this time zone + and should not be used in place of the ID or display name. + + \sa displayName() +*/ + +QString QTimeZone::abbreviation(const QDateTime &atDateTime) const +{ + if (isValid()) + return d->abbreviation(atDateTime.toMSecsSinceEpoch()); + else + return QString(); +} + +/*! + Returns the total effective offset at the given \a atDateTime, i.e. the + number of seconds to add to UTC to obtain the local time. This includes + any daylight time offset that may be in effect, i.e. it is the sum of + standardTimeOffset() and daylightTimeOffset() for the given datetime. + + For example, for the time zone "Europe/Berlin" the standard time offset is + +3600 seconds and the daylight time offset is +3600 seconds. During standard + time offsetFromUtc() will return +3600 (UTC+01:00), and during daylight time + it will return +7200 (UTC+02:00). + + \sa standardTimeOffset(), daylightTimeOffset() +*/ + +int QTimeZone::offsetFromUtc(const QDateTime &atDateTime) const +{ + if (isValid()) + return d->offsetFromUtc(atDateTime.toMSecsSinceEpoch()); + else + return 0; +} + +/*! + Returns the standard time offset at the given \a atDateTime, i.e. the + number of seconds to add to UTC to obtain the local Standard Time. This + excludes any daylight time offset that may be in effect. + + For example, for the time zone "Europe/Berlin" the standard time offset is + +3600 seconds. During both standard and daylight time offsetFromUtc() will + return +3600 (UTC+01:00). + + \sa offsetFromUtc(), daylightTimeOffset() +*/ + +int QTimeZone::standardTimeOffset(const QDateTime &atDateTime) const +{ + if (isValid()) + return d->standardTimeOffset(atDateTime.toMSecsSinceEpoch()); + else + return 0; +} + +/*! + Returns the daylight time offset at the given \a atDateTime, i.e. the + number of seconds to add to the standard time offset to obtain the local + daylight time. + + For example, for the time zone "Europe/Berlin" the daylight time offset + is +3600 seconds. During standard time daylightTimeOffset() will return + 0, and during daylight time it will return +3600. + + \sa offsetFromUtc(), standardTimeOffset() +*/ + +int QTimeZone::daylightTimeOffset(const QDateTime &atDateTime) const +{ + if (hasDaylightTime()) + return d->daylightTimeOffset(atDateTime.toMSecsSinceEpoch()); + else + return 0; +} + +/*! + Returns true if the time zone has observed daylight time at any time. + + \sa isDaylightTime(), daylightTimeOffset() +*/ + +bool QTimeZone::hasDaylightTime() const +{ + if (isValid()) + return d->hasDaylightTime(); + else + return false; +} + +/*! + Returns true if the given \a atDateTime is in daylight time. + + \sa hasDaylightTime(), daylightTimeOffset() +*/ + +bool QTimeZone::isDaylightTime(const QDateTime &atDateTime) const +{ + if (hasDaylightTime()) + return d->isDaylightTime(atDateTime.toMSecsSinceEpoch()); + else + return false; +} + +/*! + Returns the effective offset details at the given \a forDateTime. This is + the equivalent of calling offsetFromUtc(), abbreviation(), etc individually but is + more efficient. + + \sa offsetFromUtc(), standardTimeOffset(), daylightTimeOffset(), abbreviation() +*/ + +QTimeZone::OffsetData QTimeZone::offsetData(const QDateTime &forDateTime) const +{ + if (hasTransitions()) + return d->toOffsetData(d->data(forDateTime.toMSecsSinceEpoch())); + else + return d->invalidOffsetData(); +} + +/*! + Returns true if the system backend supports obtaining transitions. +*/ + +bool QTimeZone::hasTransitions() const +{ + if (isValid()) + return d->hasTransitions(); + else + return false; +} + +/*! + Returns the first time zone Transition after the given \a afterDateTime. + This is most useful when you have a Transition time and wish to find the + Transition after it. + + The given \a afterDateTime is exclusive. + + \sa hasTransitions(), previousTransition(), transitions() +*/ + +QTimeZone::OffsetData QTimeZone::nextTransition(const QDateTime &afterDateTime) const +{ + if (hasTransitions()) + return d->toOffsetData(d->nextTransition(afterDateTime.toMSecsSinceEpoch())); + else + return d->invalidOffsetData(); +} + +/*! + Returns the first time zone Transition before the given \a beforeDateTime. + This is most useful when you have a Transition time and wish to find the + Transition before it. + + The given \a beforeDateTime is exclusive. + + \sa hasTransitions(), nextTransition(), transitions() +*/ + +QTimeZone::OffsetData QTimeZone::previousTransition(const QDateTime &beforeDateTime) const +{ + if (hasTransitions()) + return d->toOffsetData(d->previousTransition(beforeDateTime.toMSecsSinceEpoch())); + else + return d->invalidOffsetData(); +} + +/*! + Returns a list of all time zone transitions between the given datetimes. + + The given \a fromDateTime and \a toDateTime are inclusive. + + \sa hasTransitions(), nextTransition(), previousTransition() +*/ + +QTimeZone::OffsetDataList QTimeZone::transitions(const QDateTime &fromDateTime, + const QDateTime &toDateTime) const +{ + OffsetDataList list; + if (hasTransitions()) { + QTimeZonePrivate::DataList plist = d->transitions(fromDateTime.toMSecsSinceEpoch(), + toDateTime.toMSecsSinceEpoch()); + foreach (const QTimeZonePrivate::Data &pdata, plist) + list.append(d->toOffsetData(pdata)); + } + return list; +} + +// Static methods + +/*! + Returns the current system time zone Olsen ID. + + On Windows this ID is translated from the the Windows ID using an internal + translation table and the user's selected country. As a consequence there + is a small chance any Windows install may have IDs not known by Qt, in + which case "UTC" will be returned. +*/ + +QByteArray QTimeZone::systemTimeZoneId() +{ + return global_tz->backend->systemTimeZoneId(); +} + +/*! + Returns true if a given time zone \a olsenId is available on this system. + + \sa availableTimeZoneIds() +*/ + +bool QTimeZone::isTimeZoneIdAvailable(const QByteArray &olsenId) +{ + // isValidId is not strictly required, but faster to weed out invalid + // IDs as availableTimeZoneIds() may be slow + return (QTimeZonePrivate::isValidId(olsenId) && (availableTimeZoneIds().contains(olsenId))); +} + +/*! + Returns a list of all available Olsen time zone IDs on this system. + + \sa isTimeZoneIdAvailable() +*/ + +QList<QByteArray> QTimeZone::availableTimeZoneIds() +{ + QSet<QByteArray> set = QUtcTimeZonePrivate().availableTimeZoneIds() + + global_tz->backend->availableTimeZoneIds(); + QList<QByteArray> list = set.toList(); + qSort(list); + return list; +} + +/*! + Returns a list of all available Olsen time zone IDs for a given \a country. + + As a special case, a \a country of Qt::AnyCountry returns those time zones + that do not have any country related to them, such as UTC. If you require + a list of all time zone IDs for all countries then use the standard + availableTimeZoneIds() method. + + \sa isTimeZoneIdAvailable() +*/ + +QList<QByteArray> QTimeZone::availableTimeZoneIds(QLocale::Country country) +{ + QSet<QByteArray> set = QUtcTimeZonePrivate().availableTimeZoneIds(country) + + global_tz->backend->availableTimeZoneIds(country); + QList<QByteArray> list = set.toList(); + qSort(list); + return list; +} + +/*! + Returns a list of all available Olsen time zone IDs with a given standard + time offset of \a offsetSeconds. + + \sa isTimeZoneIdAvailable() +*/ + +QList<QByteArray> QTimeZone::availableTimeZoneIds(int offsetSeconds) +{ + QSet<QByteArray> set = QUtcTimeZonePrivate().availableTimeZoneIds(offsetSeconds) + + global_tz->backend->availableTimeZoneIds(offsetSeconds); + QList<QByteArray> list = set.toList(); + qSort(list); + return list; +} + +/*! + Returns the Windows ID equivalent to the given \a olsenId. + + \sa windowsIdToDefaultOlsenId(), windowsIdToOlsenIds() +*/ + +QByteArray QTimeZone::olsenIdToWindowsId(const QByteArray &olsenId) +{ + return QTimeZonePrivate::olsenIdToWindowsId(olsenId); +} + +/*! + Returns the default Olsen ID for a given \a windowsId. + + Because a Windows ID can cover several Olsen IDs in several different + countries, this function returns the most frequently used Olsen ID with no + regard for the country and should thus be used with care. It is usually + best to request the default for a specific country. + + \sa olsenIdToWindowsId(), windowsIdToOlsenIds() +*/ + +QByteArray QTimeZone::windowsIdToDefaultOlsenId(const QByteArray &windowsId) +{ + return QTimeZonePrivate::windowsIdToDefaultOlsenId(windowsId); +} + +/*! + Returns the default Olsen ID for a given \a windowsId and \a country. + + Because a Windows ID can cover several Olsen IDs within a given country, + the most frequently used Olsen ID in that country is returned. + + As a special case, QLocale::AnyCountry returns the default of those Olsen IDs + that do not have any specific country. + + \sa olsenIdToWindowsId(), windowsIdToOlsenIds() +*/ + +QByteArray QTimeZone::windowsIdToDefaultOlsenId(const QByteArray &windowsId, + QLocale::Country country) +{ + return QTimeZonePrivate::windowsIdToDefaultOlsenId(windowsId, country); +} + +/*! + Returns all the Olsen IDs for a given \a windowsId. + + The returned list is sorted alphabetically. + + \sa olsenIdToWindowsId(), windowsIdToDefaultOlsenId() +*/ + +QList<QByteArray> QTimeZone::windowsIdToOlsenIds(const QByteArray &windowsId) +{ + return QTimeZonePrivate::windowsIdToOlsenIds(windowsId); +} + +/*! + Returns all the Olsen IDs for a given \a windowsId and \a country. + + As a special case QLocale::AnyCountry returns those Olsen IDs that do + not have any specific country. + + The returned list is in order of frequency of usage, i.e. larger zones + within a country are listed first. + + \sa olsenIdToWindowsId(), windowsIdToDefaultOlsenId() +*/ + +QList<QByteArray> QTimeZone::windowsIdToOlsenIds(const QByteArray &windowsId, + QLocale::Country country) +{ + return QTimeZonePrivate::windowsIdToOlsenIds(windowsId, country); +} + +#ifndef QT_NO_DATASTREAM +QDataStream &operator<<(QDataStream &ds, const QTimeZone &tz) +{ + tz.d->serialize(ds); + return ds; +} + +QDataStream &operator>>(QDataStream &ds, QTimeZone &tz) +{ + QString olsenId; + ds >> olsenId; + if (olsenId == QStringLiteral("OffsetFromUtc")) { + int utcOffset; + QString name; + QString abbreviation; + int country; + QString comment; + ds >> olsenId >> utcOffset >> name >> abbreviation >> country >> comment; + tz = QTimeZone(olsenId.toUtf8(), utcOffset, name, abbreviation, (QLocale::Country) country, comment); + } else { + tz = QTimeZone(olsenId.toUtf8()); + } + return ds; +} +#endif // QT_NO_DATASTREAM + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug dbg, const QTimeZone &tz) +{ + //TODO Include backend and data version details? + dbg.nospace() << QStringLiteral("QTimeZone(") << qPrintable(QString::fromUtf8(tz.id())) << ')'; + return dbg.space(); +} +#endif + +QT_END_NAMESPACE diff --git a/src/corelib/tools/qtimezone.h b/src/corelib/tools/qtimezone.h new file mode 100644 index 0000000000..5eeb22f8f3 --- /dev/null +++ b/src/corelib/tools/qtimezone.h @@ -0,0 +1,162 @@ +/**************************************************************************** +** +** Copyright (C) 2013 John Layt <jlayt@kde.org> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#ifndef QTIMEZONE_H +#define QTIMEZONE_H + +#include <QtCore/qsharedpointer.h> +#include <QtCore/qlocale.h> +#include <QtCore/qdatetime.h> + +QT_BEGIN_NAMESPACE + +class QTimeZonePrivate; + +class Q_CORE_EXPORT QTimeZone +{ +public: + enum TimeType { + StandardTime = 0, + DaylightTime = 1, + GenericTime = 2 + }; + + enum NameType { + DefaultName = 0, + LongName = 1, + ShortName = 2, + OffsetName = 3 + }; + + struct OffsetData { + QString abbreviation; + QDateTime atUtc; + int offsetFromUtc; + int standardTimeOffset; + int daylightTimeOffset; + }; + typedef QVector<OffsetData> OffsetDataList; + + QTimeZone(); + explicit QTimeZone(const QByteArray &olsenId); + QTimeZone(int offsetSeconds); + QTimeZone(const QByteArray &zoneId, int offsetSeconds, const QString &name, + const QString &abbreviation, QLocale::Country country = QLocale::AnyCountry, + const QString &comment = QString()); + QTimeZone(const QTimeZone &other); + ~QTimeZone(); + + QTimeZone &operator=(const QTimeZone &other); + #ifdef Q_COMPILER_RVALUE_REFS + QTimeZone &operator=(QTimeZone &&other) { std::swap(d, other.d); return *this; } +#endif + + bool operator==(const QTimeZone &other) const; + bool operator!=(const QTimeZone &other) const; + + bool isValid() const; + + QByteArray id() const; + QLocale::Country country() const; + QString comment() const; + + QString displayName(const QDateTime &atDateTime, + QTimeZone::NameType nameType = QTimeZone::DefaultName, + const QLocale &locale = QLocale()) const; + QString displayName(QTimeZone::TimeType timeType, + QTimeZone::NameType nameType = QTimeZone::DefaultName, + const QLocale &locale = QLocale()) const; + QString abbreviation(const QDateTime &atDateTime) const; + + int offsetFromUtc(const QDateTime &atDateTime) const; + int standardTimeOffset(const QDateTime &atDateTime) const; + int daylightTimeOffset(const QDateTime &atDateTime) const; + + bool hasDaylightTime() const; + bool isDaylightTime(const QDateTime &atDateTime) const; + + OffsetData offsetData(const QDateTime &forDateTime) const; + + bool hasTransitions() const; + OffsetData nextTransition(const QDateTime &afterDateTime) const; + OffsetData previousTransition(const QDateTime &beforeDateTime) const; + OffsetDataList transitions(const QDateTime &fromDateTime, const QDateTime &toDateTime) const; + + static QByteArray systemTimeZoneId(); + + static bool isTimeZoneIdAvailable(const QByteArray &olsenId); + + static QList<QByteArray> availableTimeZoneIds(); + static QList<QByteArray> availableTimeZoneIds(QLocale::Country country); + static QList<QByteArray> availableTimeZoneIds(int offsetSeconds); + + static QByteArray olsenIdToWindowsId(const QByteArray &olsenId); + static QByteArray windowsIdToDefaultOlsenId(const QByteArray &windowsId); + static QByteArray windowsIdToDefaultOlsenId(const QByteArray &windowsId, + QLocale::Country country); + static QList<QByteArray> windowsIdToOlsenIds(const QByteArray &windowsId); + static QList<QByteArray> windowsIdToOlsenIds(const QByteArray &windowsId, + QLocale::Country country); + +private: + QTimeZone(QTimeZonePrivate &dd); +#ifndef QT_NO_DATASTREAM + friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &ds, const QTimeZone &tz); +#endif + friend class QTimeZonePrivate; + QSharedDataPointer<QTimeZonePrivate> d; +}; + +Q_DECLARE_TYPEINFO(QTimeZone::OffsetData, Q_MOVABLE_TYPE); + +#ifndef QT_NO_DATASTREAM +Q_CORE_EXPORT QDataStream &operator<<(QDataStream &ds, const QTimeZone &tz); +Q_CORE_EXPORT QDataStream &operator>>(QDataStream &ds, QTimeZone &tz); +#endif + +#ifndef QT_NO_DEBUG_STREAM +Q_CORE_EXPORT QDebug operator<<(QDebug dbg, const QTimeZone &tz); +#endif + +QT_END_NAMESPACE + +#endif // QTIMEZONE_H diff --git a/src/corelib/tools/qtimezoneprivate.cpp b/src/corelib/tools/qtimezoneprivate.cpp new file mode 100644 index 0000000000..4a8d891759 --- /dev/null +++ b/src/corelib/tools/qtimezoneprivate.cpp @@ -0,0 +1,643 @@ +/**************************************************************************** +** +** Copyright (C) 2013 John Layt <jlayt@kde.org> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include "qtimezone.h" +#include "qtimezoneprivate_p.h" +#include "qtimezoneprivate_data_p.h" + +#include <qdebug.h> + +QT_BEGIN_NAMESPACE + +/* + Static utilities for looking up Windows ID tables +*/ + +static const int windowsDataTableSize = sizeof(windowsDataTable) / sizeof(QWindowsData) - 1; +static const int zoneDataTableSize = sizeof(zoneDataTable) / sizeof(QZoneData) - 1; +static const int utcDataTableSize = sizeof(utcDataTable) / sizeof(QUtcData) - 1; + + +static const QZoneData *zoneData(quint16 index) +{ + Q_ASSERT(index < zoneDataTableSize); + return &zoneDataTable[index]; +} + +static const QWindowsData *windowsData(quint16 index) +{ + Q_ASSERT(index < windowsDataTableSize); + return &windowsDataTable[index]; +} + +static const QUtcData *utcData(quint16 index) +{ + Q_ASSERT(index < utcDataTableSize); + return &utcDataTable[index]; +} + +// Return the Windows ID literal for a given QWindowsData +static QByteArray windowsId(const QWindowsData *windowsData) +{ + return (windowsIdData + windowsData->windowsIdIndex); +} + +// Return the Olsen ID literal for a given QWindowsData +static QByteArray olsenId(const QWindowsData *windowsData) +{ + return (olsenIdData + windowsData->olsenIdIndex); +} + +// Return the Olsen ID literal for a given QZoneData +static QByteArray olsenId(const QZoneData *zoneData) +{ + return (olsenIdData + zoneData->olsenIdIndex); +} + +static QByteArray utcId(const QUtcData *utcData) +{ + return (olsenIdData + utcData->olsenIdIndex); +} + +static quint16 toWindowsIdKey(const QByteArray &winId) +{ + for (quint16 i = 0; i < windowsDataTableSize; ++i) { + const QWindowsData *data = windowsData(i); + if (windowsId(data) == winId) + return data->windowsIdKey; + } + return 0; +} + +static QByteArray toWindowsIdLiteral(quint16 windowsIdKey) +{ + for (quint16 i = 0; i < windowsDataTableSize; ++i) { + const QWindowsData *data = windowsData(i); + if (data->windowsIdKey == windowsIdKey) + return windowsId(data); + } + return QByteArray(); +} + +/* + Base class implementing common utility routines, only intantiate for a null tz. +*/ + +QTimeZonePrivate::QTimeZonePrivate() +{ +} + +QTimeZonePrivate::QTimeZonePrivate(const QTimeZonePrivate &other) + : QSharedData(other), m_id(other.m_id) +{ +} + +QTimeZonePrivate::~QTimeZonePrivate() +{ +} + +QTimeZonePrivate *QTimeZonePrivate::clone() +{ + return new QTimeZonePrivate(*this); +} + +bool QTimeZonePrivate::operator==(const QTimeZonePrivate &other) const +{ + // TODO Too simple, but need to solve problem of comparing different derived classes + // Should work for all System and ICU classes as names guaranteed unique, but not for Simple. + // Perhaps once all classes have working transitions can compare full list? + return (m_id == other.m_id); +} + +bool QTimeZonePrivate::operator!=(const QTimeZonePrivate &other) const +{ + return !(*this == other); +} + +bool QTimeZonePrivate::isValid() const +{ + return !m_id.isEmpty(); +} + +QByteArray QTimeZonePrivate::id() const +{ + return m_id; +} + +QLocale::Country QTimeZonePrivate::country() const +{ + // Default fall-back mode, use the zoneTable to find Region of known Zones + for (int i = 0; i < zoneDataTableSize; ++i) { + const QZoneData *data = zoneData(i); + if (olsenId(data).split(' ').contains(m_id)) + return (QLocale::Country)data->country; + } + return QLocale::AnyCountry; +} + +QString QTimeZonePrivate::comment() const +{ + return QString(); +} + +QString QTimeZonePrivate::displayName(qint64 atMSecsSinceEpoch, + QTimeZone::NameType nameType, + const QLocale &locale) const +{ + if (nameType == QTimeZone::OffsetName) + return isoOffsetFormat(offsetFromUtc(atMSecsSinceEpoch)); + + if (isDaylightTime(atMSecsSinceEpoch)) + return displayName(QTimeZone::DaylightTime, nameType, locale); + else + return displayName(QTimeZone::StandardTime, nameType, locale); +} + +QString QTimeZonePrivate::displayName(QTimeZone::TimeType timeType, + QTimeZone::NameType nameType, + const QLocale &locale) const +{ + Q_UNUSED(timeType) + Q_UNUSED(nameType) + Q_UNUSED(locale) + return QString(); +} + +QString QTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const +{ + Q_UNUSED(atMSecsSinceEpoch) + return QString(); +} + +int QTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const +{ + return standardTimeOffset(atMSecsSinceEpoch) + daylightTimeOffset(atMSecsSinceEpoch); +} + +int QTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const +{ + Q_UNUSED(atMSecsSinceEpoch) + return invalidSeconds(); +} + +int QTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const +{ + Q_UNUSED(atMSecsSinceEpoch) + return invalidSeconds(); +} + +bool QTimeZonePrivate::hasDaylightTime() const +{ + return false; +} + +bool QTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const +{ + Q_UNUSED(atMSecsSinceEpoch) + return false; +} + +QTimeZonePrivate::Data QTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const +{ + Q_UNUSED(forMSecsSinceEpoch) + return invalidData(); +} + +bool QTimeZonePrivate::hasTransitions() const +{ + return false; +} + +QTimeZonePrivate::Data QTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const +{ + Q_UNUSED(afterMSecsSinceEpoch) + return invalidData(); +} + +QTimeZonePrivate::Data QTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const +{ + Q_UNUSED(beforeMSecsSinceEpoch) + return invalidData(); +} + +QTimeZonePrivate::DataList QTimeZonePrivate::transitions(qint64 fromMSecsSinceEpoch, + qint64 toMSecsSinceEpoch) const +{ + DataList list; + if (toMSecsSinceEpoch > fromMSecsSinceEpoch) { + // fromMSecsSinceEpoch is inclusive but nextTransitionTime() is exclusive so go back 1 msec + Data next = nextTransition(fromMSecsSinceEpoch - 1); + while (next.atMSecsSinceEpoch <= toMSecsSinceEpoch) { + list.append(next); + next = nextTransition(next.atMSecsSinceEpoch); + } + } + return list; +} + +QByteArray QTimeZonePrivate::systemTimeZoneId() const +{ + return QByteArray(); +} + +QSet<QByteArray> QTimeZonePrivate::availableTimeZoneIds() const +{ + return QSet<QByteArray>(); +} + +QSet<QByteArray> QTimeZonePrivate::availableTimeZoneIds(QLocale::Country country) const +{ + // Default fall-back mode, use the zoneTable to find Region of know Zones + QSet<QByteArray> regionSet; + + // First get all Zones in the Zones table belonging to the Region + for (int i = 0; i < zoneDataTableSize; ++i) { + if (zoneData(i)->country == country) + regionSet += olsenId(zoneData(i)).split(' ').toSet(); + } + + // Then select just those that are available + QSet<QByteArray> set; + foreach (const QByteArray &olsenId, availableTimeZoneIds()) { + if (regionSet.contains(olsenId)) + set << olsenId; + } + + return set; +} + +QSet<QByteArray> QTimeZonePrivate::availableTimeZoneIds(int offsetFromUtc) const +{ + // Default fall-back mode, use the zoneTable to find Offset of know Zones + QSet<QByteArray> offsetSet; + // First get all Zones in the table using the Offset + for (int i = 0; i < windowsDataTableSize; ++i) { + const QWindowsData *winData = windowsData(i); + if (winData->offsetFromUtc == offsetFromUtc) { + for (int j = 0; j < zoneDataTableSize; ++j) { + const QZoneData *data = zoneData(j); + if (data->windowsIdKey == winData->windowsIdKey) + offsetSet += olsenId(data).split(' ').toSet(); + } + } + } + + // Then select just those that are available + QSet<QByteArray> set; + foreach (const QByteArray &olsenId, availableTimeZoneIds()) { + if (offsetSet.contains(olsenId)) + set << olsenId; + } + + return set; +} + +#ifndef QT_NO_DATASTREAM +void QTimeZonePrivate::serialize(QDataStream &ds) const +{ + ds << QString::fromUtf8(m_id); +} +#endif // QT_NO_DATASTREAM + +// Static Utility Methods + +QTimeZonePrivate::Data QTimeZonePrivate::invalidData() +{ + Data data; + data.atMSecsSinceEpoch = invalidMSecs(); + data.offsetFromUtc = invalidSeconds(); + data.standardTimeOffset = invalidSeconds(); + data.daylightTimeOffset = invalidSeconds(); + return data; +} + +QTimeZone::OffsetData QTimeZonePrivate::invalidOffsetData() +{ + QTimeZone::OffsetData offsetData; + offsetData.atUtc = QDateTime(); + offsetData.offsetFromUtc = invalidSeconds(); + offsetData.standardTimeOffset = invalidSeconds(); + offsetData.daylightTimeOffset = invalidSeconds(); + return offsetData; +} + +QTimeZone::OffsetData QTimeZonePrivate::toOffsetData(const QTimeZonePrivate::Data &data) +{ + QTimeZone::OffsetData offsetData = invalidOffsetData(); + if (data.atMSecsSinceEpoch != invalidMSecs()) { + offsetData.atUtc = QDateTime::fromMSecsSinceEpoch(data.atMSecsSinceEpoch, Qt::UTC); + offsetData.offsetFromUtc = data.offsetFromUtc; + offsetData.standardTimeOffset = data.standardTimeOffset; + offsetData.daylightTimeOffset = data.daylightTimeOffset; + offsetData.abbreviation = data.abbreviation; + } + return offsetData; +} + +// If the format of the ID is valid +bool QTimeZonePrivate::isValidId(const QByteArray &olsenId) +{ + // Rules for defining TZ/Olsen names as per ftp://ftp.iana.org/tz/code/Theory + // * Use only valid POSIX file name components + // * Within a file name component, use only ASCII letters, `.', `-' and `_'. + // * Do not use digits + // * A file name component must not exceed 14 characters or start with `-' + // Aliases such as "Etc/GMT+7" and "SystemV/EST5EDT" are valid so we need to accept digits + if (olsenId.contains(' ')) + return false; + QList<QByteArray> parts = olsenId.split('\\'); + foreach (const QByteArray &part, parts) { + if (part.size() > 14) + return false; + if (part.at(0) == '-') + return false; + for (int i = 0; i < part.size(); ++i) { + QChar ch = part.at(i); + if (!(ch >= 'a' && ch <= 'z') + && !(ch >= 'A' && ch <= 'Z') + && !(ch == '_') + && !(ch >= '0' && ch <= '9') + && !(ch == '-') + && !(ch == '.')) + return false; + } + } + return true; +} + +QString QTimeZonePrivate::isoOffsetFormat(int offsetFromUtc) +{ + const int mins = offsetFromUtc / 60; + return QString::fromUtf8("UTC%1%2:%3").arg(mins >= 0 ? QLatin1Char('+') : QLatin1Char('-')) + .arg(qAbs(mins) / 60, 2, 10, QLatin1Char('0')) + .arg(qAbs(mins) % 60, 2, 10, QLatin1Char('0')); +} + +QByteArray QTimeZonePrivate::olsenIdToWindowsId(const QByteArray &id) +{ + for (int i = 0; i < zoneDataTableSize; ++i) { + const QZoneData *data = zoneData(i); + if (olsenId(data).split(' ').contains(id)) + return toWindowsIdLiteral(data->windowsIdKey); + } + return QByteArray(); +} + +QByteArray QTimeZonePrivate::windowsIdToDefaultOlsenId(const QByteArray &windowsId) +{ + const quint16 windowsIdKey = toWindowsIdKey(windowsId); + for (int i = 0; i < windowsDataTableSize; ++i) { + const QWindowsData *data = windowsData(i); + if (data->windowsIdKey == windowsIdKey) + return olsenId(data); + } + return QByteArray(); +} + +QByteArray QTimeZonePrivate::windowsIdToDefaultOlsenId(const QByteArray &windowsId, + QLocale::Country country) +{ + const QList<QByteArray> list = windowsIdToOlsenIds(windowsId, country); + if (list.count() > 0) + return list.first(); + else + return QByteArray(); +} + +QList<QByteArray> QTimeZonePrivate::windowsIdToOlsenIds(const QByteArray &windowsId) +{ + const quint16 windowsIdKey = toWindowsIdKey(windowsId); + QList<QByteArray> list; + + for (int i = 0; i < zoneDataTableSize; ++i) { + const QZoneData *data = zoneData(i); + if (data->windowsIdKey == windowsIdKey) + list << olsenId(data).split(' '); + } + + // Return the full list in alpha order + std::sort(list.begin(), list.end()); + return list; +} + +QList<QByteArray> QTimeZonePrivate::windowsIdToOlsenIds(const QByteArray &windowsId, + QLocale::Country country) +{ + const quint16 windowsIdKey = toWindowsIdKey(windowsId); + for (int i = 0; i < zoneDataTableSize; ++i) { + const QZoneData *data = zoneData(i); + // Return the region matches in preference order + if (data->windowsIdKey == windowsIdKey && data->country == (quint16) country) + return olsenId(data).split(' '); + } + + return QList<QByteArray>(); +} + +// Define template for derived classes to reimplement so QSharedDataPointer clone() works correctly +template<> QTimeZonePrivate *QSharedDataPointer<QTimeZonePrivate>::clone() +{ + return d->clone(); +} + +/* + UTC Offset implementation, used when QT_NO_SYSTEMLOCALE set and QT_USE_ICU not set, + or for QDateTimes with a Qt:Spec of Qt::OffsetFromUtc. +*/ + +// Create default UTC time zone +QUtcTimeZonePrivate::QUtcTimeZonePrivate() +{ + const QString name = QStringLiteral("UTC"); + init(QByteArrayLiteral("UTC"), 0, name, name, QLocale::AnyCountry, name); +} + +// Create a named UTC time zone +QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QByteArray &id) +{ + // Look for the name in the UTC list, if found set the values + for (int i = 0; i < utcDataTableSize; ++i) { + const QUtcData *data = utcData(i); + const QByteArray uid = utcId(data); + if (uid == id) { + QString name = QString::fromUtf8(id); + init(id, data->offsetFromUtc, name, name, QLocale::AnyCountry, name); + break; + } + } +} + +// Create offset from UTC +QUtcTimeZonePrivate::QUtcTimeZonePrivate(qint32 offsetSeconds) +{ + QString utcId; + + if (offsetSeconds == 0) + utcId = QStringLiteral("UTC"); + else + utcId = isoOffsetFormat(offsetSeconds); + + init(utcId.toUtf8(), offsetSeconds, utcId, utcId, QLocale::AnyCountry, utcId); +} + +QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QByteArray &zoneId, int offsetSeconds, + const QString &name, const QString &abbreviation, + QLocale::Country country, const QString &comment) +{ + init(zoneId, offsetSeconds, name, abbreviation, country, comment); +} + +QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QUtcTimeZonePrivate &other) + : QTimeZonePrivate(other), m_offsetFromUtc(other.m_offsetFromUtc), m_name(other.m_name), + m_abbreviation(other.m_abbreviation), m_country(other.m_country), + m_comment(other.m_comment) +{ +} + +QUtcTimeZonePrivate::~QUtcTimeZonePrivate() +{ +} + +QTimeZonePrivate *QUtcTimeZonePrivate::clone() +{ + return new QUtcTimeZonePrivate(*this); +} + +void QUtcTimeZonePrivate::init(const QByteArray &zoneId) +{ + m_id = zoneId; +} + +void QUtcTimeZonePrivate::init(const QByteArray &zoneId, int offsetSeconds, const QString &name, + const QString &abbreviation, QLocale::Country country, + const QString &comment) +{ + m_id = zoneId; + m_offsetFromUtc = offsetSeconds; + m_name = name; + m_abbreviation = abbreviation; + m_country = country; + m_comment = comment; +} + +QLocale::Country QUtcTimeZonePrivate::country() const +{ + return m_country; +} + +QString QUtcTimeZonePrivate::comment() const +{ + return m_comment; +} + +QString QUtcTimeZonePrivate::displayName(QTimeZone::TimeType timeType, + QTimeZone::NameType nameType, + const QLocale &locale) const +{ + Q_UNUSED(timeType) + Q_UNUSED(locale) + if (nameType == QTimeZone::ShortName) + return m_abbreviation; + else if (nameType == QTimeZone::OffsetName) + return isoOffsetFormat(m_offsetFromUtc); + return m_name; +} + +QString QUtcTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const +{ + Q_UNUSED(atMSecsSinceEpoch) + return m_abbreviation; +} + +qint32 QUtcTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const +{ + Q_UNUSED(atMSecsSinceEpoch) + return m_offsetFromUtc; +} + +qint32 QUtcTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const +{ + Q_UNUSED(atMSecsSinceEpoch) + return 0; +} + +QByteArray QUtcTimeZonePrivate::systemTimeZoneId() const +{ + return QByteArrayLiteral("UTC"); +} + +QSet<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds() const +{ + QSet<QByteArray> set; + for (int i = 0; i < utcDataTableSize; ++i) + set << utcId(utcData(i)); + return set; +} + +QSet<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds(QLocale::Country country) const +{ + // If AnyCountry then is request for all non-region offset codes + if (country == QLocale::AnyCountry) + return availableTimeZoneIds(); + return QSet<QByteArray>(); +} + +QSet<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds(qint32 offsetSeconds) const +{ + QSet<QByteArray> set; + for (int i = 0; i < utcDataTableSize; ++i) { + const QUtcData *data = utcData(i); + if (data->offsetFromUtc == offsetSeconds) + set << utcId(data); + } + return set; +} + +#ifndef QT_NO_DATASTREAM +void QUtcTimeZonePrivate::serialize(QDataStream &ds) const +{ + ds << QStringLiteral("OffsetFromUtc") << QString::fromUtf8(m_id) << m_offsetFromUtc << m_name + << m_abbreviation << (qint32) m_country << m_comment; +} +#endif // QT_NO_DATASTREAM + +QT_END_NAMESPACE diff --git a/src/corelib/tools/qtimezoneprivate_data_p.h b/src/corelib/tools/qtimezoneprivate_data_p.h new file mode 100644 index 0000000000..bb87eab1f3 --- /dev/null +++ b/src/corelib/tools/qtimezoneprivate_data_p.h @@ -0,0 +1,1122 @@ +/**************************************************************************** +** +** Copyright (C) 2013 John Layt <jlayt@kde.org> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#ifndef QTIMEZONEPRIVATE_DATA_P_H +#define QTIMEZONEPRIVATE_DATA_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of internal files. This header file may change from version to version +// without notice, or even be removed. +// +// We mean it. +// + +QT_BEGIN_NAMESPACE + +/* + Windows Zone ID support, included in default base class build so can be used on all platforms, + e.g. an app running on Linux may need to communicate with a Windows Outlook server. These + tables can also be used to look-up Region Codes and UTC Offsets on platforms that don't directly + support them., e.g. Mac does not support availableTimeZones() filtering by region or offset. + + Another data table is provided for generic UTC+00:00 format time zones to be used as a + fall-back if no system time zones are available (QT_NO_SYSTEMLOCALE is set) or for QDateTimes + with a QT:Spec of OffsetFromUTC + + These tables are automatically adapted from the CLDR supplemental/windowsZones.xml data file + using a script in qtbase/util/local_database. Please do not edit this data directly. In the + future if ICU is made a hard dependency then the ICU resource can be used directly and this + table removed +*/ + +struct QZoneData { + quint16 windowsIdKey; // Windows ID Key + quint16 country; // Country of Olsen ID's, AnyCountry means No Country + quint16 olsenIdIndex; // All Olsen ID's for the Windows ID and Country, space separated +}; + +struct QWindowsData { + quint16 windowsIdKey; // Windows ID Key + quint16 windowsIdIndex; // Windows ID Literal + quint16 olsenIdIndex; // Default Olsen ID for the Windows ID + qint32 offsetFromUtc; // Standard Time Offset from UTC, used for quick look-ups +}; + +struct QUtcData { + quint16 olsenIdIndex; // Olsen ID's + qint32 offsetFromUtc; // Offset form UTC is seconds +}; + +/* + COPYRIGHT AND PERMISSION NOTICE + + Copyright © 1991-2012 Unicode, Inc. All rights reserved. Distributed under + the Terms of Use in http://www.unicode.org/copyright.html. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of the Unicode data files and any associated documentation (the "Data + Files") or Unicode software and any associated documentation (the "Software") + to deal in the Data Files or Software without restriction, including without + limitation the rights to use, copy, modify, merge, publish, distribute, and/or + sell copies of the Data Files or Software, and to permit persons to whom the + Data Files or Software are furnished to do so, provided that (a) the above + copyright notice(s) and this permission notice appear with all copies of the + Data Files or Software, (b) both the above copyright notice(s) and this + permission notice appear in associated documentation, and (c) there is clear + notice in each modified Data File or in the Software as well as in the + documentation associated with the Data File(s) or Software that the data or + software has been modified. +*/ + +// GENERATED PART STARTS HERE + +/* + This part of the file was generated on 2013-03-18 from the + Common Locale Data Repository supplemental/windowsZones.xml file + $Revision: 7825 $ $Date: 2012-10-10 14:45:31 -0700 (Wed, 10 Oct 2012) $ + + http://www.unicode.org/cldr/ + + Do not change this data, only generate it using cldr2qtimezone.py. +*/ + +// Windows ID Key, Country Enum, Olsen ID Index +static const QZoneData zoneDataTable[] = { + { 95, 157, 0 }, // W. Central Africa Standard Time / Nigeria + { 36, 73, 13 }, // FLE Standard Time / Finland + { 26, 97, 29 }, // China Standard Time / HongKong + { 83, 112, 44 }, // Tonga Standard Time / Kiribati + { 7, 24, 62 }, // Atlantic Standard Time / Bermuda + { 82, 101, 79 }, // Tokyo Standard Time / Indonesia + { 36, 68, 93 }, // FLE Standard Time / Estonia + { 73, 93, 108 }, // SA Western Standard Time / Guyana + { 73, 144, 123 }, // SA Western Standard Time / Montserrat + { 80, 208, 142 }, // Taipei Standard Time / Taiwan + { 96, 184, 154 }, // W. Europe Standard Time / SanMarino + { 17, 13, 172 }, // Cen. Australia Standard Time / Australia + { 72, 166, 213 }, // SA Pacific Standard Time / Panama + { 72, 47, 228 }, // SA Pacific Standard Time / Colombia + { 40, 132, 243 }, // Greenwich Standard Time / Mali + { 61, 38, 257 }, // Newfoundland Standard Time / Canada + { 18, 96, 274 }, // Central America Standard Time / Honduras + { 28, 48, 294 }, // E. Africa Standard Time / Comoros + { 85, 143, 308 }, // Ulaanbaatar Standard Time / Mongolia + { 73, 180, 341 }, // SA Western Standard Time / SaintKittsAndNevis + { 40, 236, 358 }, // Greenwich Standard Time / WesternSahara + { 97, 110, 374 }, // West Asia Standard Time / Kazakhstan + { 42, 77, 407 }, // Hawaiian Standard Time / FrenchPolynesia + { 6, 10, 422 }, // Argentina Standard Time / Argentina + { 20, 30, 695 }, // Central Brazilian Standard Time / Brazil + { 47, 20, 731 }, // Kaliningrad Standard Time / Belarus + { 32, 38, 744 }, // Eastern Standard Time / Canada + { 48, 114, 849 }, // Korea Standard Time / SouthKorea + { 87, 0, 860 }, // US Mountain Standard Time / AnyCountry + { 94, 13, 870 }, // W. Australia Standard Time / Australia + { 60, 8, 886 }, // New Zealand Standard Time / Antarctica + { 90, 0, 927 }, // UTC / AnyCountry + { 96, 133, 935 }, // W. Europe Standard Time / Malta + { 73, 88, 948 }, // SA Western Standard Time / Guadeloupe + { 56, 46, 967 }, // Myanmar Standard Time / CocosIslands + { 91, 220, 980 }, // UTC+12 / Tuvalu + { 1, 1, 997 }, // Afghanistan Standard Time / Afghanistan + { 41, 177, 1008 }, // GTB Standard Time / Romania + { 73, 26, 1025 }, // SA Western Standard Time / Bolivia + { 88, 30, 1040 }, // UTC-02 / Brazil + { 96, 123, 1056 }, // W. Europe Standard Time / Liechtenstein + { 25, 139, 1069 }, // Central Standard Time / Mexico + { 40, 199, 1087 }, // Greenwich Standard Time / SaintHelena + { 52, 227, 1106 }, // Montevideo Standard Time / Uruguay + { 55, 139, 1125 }, // Mountain Standard Time / Mexico + { 98, 8, 1141 }, // West Pacific Standard Time / Antarctica + { 36, 248, 1167 }, // FLE Standard Time / AlandIslands + { 25, 38, 1184 }, // Central Standard Time / Canada + { 32, 219, 1259 }, // Eastern Standard Time / TurksAndCaicosIslands + { 72, 63, 1278 }, // SA Pacific Standard Time / Ecuador + { 26, 44, 1296 }, // China Standard Time / China + { 31, 30, 1362 }, // E. South America Standard Time / Brazil + { 95, 216, 1380 }, // W. Central Africa Standard Time / Tunisia + { 97, 228, 1393 }, // West Asia Standard Time / Uzbekistan + { 42, 0, 1422 }, // Hawaiian Standard Time / AnyCountry + { 28, 8, 1433 }, // E. Africa Standard Time / Antarctica + { 36, 33, 1450 }, // FLE Standard Time / Bulgaria + { 18, 65, 1463 }, // Central America Standard Time / ElSalvador + { 76, 130, 1483 }, // Singapore Standard Time / Malaysia + { 73, 0, 1514 }, // SA Western Standard Time / AnyCountry + { 70, 178, 1524 }, // Russian Standard Time / Russia + { 89, 158, 1569 }, // UTC-11 / Niue + { 77, 120, 1582 }, // South Africa Standard Time / Lesotho + { 87, 139, 1596 }, // US Mountain Standard Time / Mexico + { 28, 111, 1615 }, // E. Africa Standard Time / Kenya + { 98, 160, 1630 }, // West Pacific Standard Time / NorthernMarianaIslands + { 28, 194, 1645 }, // E. Africa Standard Time / Somalia + { 26, 126, 1662 }, // China Standard Time / Macau + { 96, 151, 1673 }, // W. Europe Standard Time / Netherlands + { 87, 225, 1690 }, // US Mountain Standard Time / UnitedStates + { 38, 251, 1706 }, // GMT Standard Time / IsleOfMan + { 91, 226, 1725 }, // UTC+12 / UnitedStatesMinorOutlyingIslands + { 23, 153, 1738 }, // Central Pacific Standard Time / NewCaledonia + { 73, 135, 1753 }, // SA Western Standard Time / Martinique + { 19, 8, 1772 }, // Central Asia Standard Time / Antarctica + { 18, 0, 1790 }, // Central America Standard Time / AnyCountry + { 23, 229, 1800 }, // Central Pacific Standard Time / Vanuatu + { 39, 86, 1814 }, // Greenland Standard Time / Greenland + { 38, 71, 1830 }, // GMT Standard Time / FaroeIslands + { 82, 108, 1846 }, // Tokyo Standard Time / Japan + { 21, 192, 1857 }, // Central Europe Standard Time / Slovenia + { 77, 35, 1874 }, // South Africa Standard Time / Burundi + { 75, 232, 1891 }, // SE Asia Standard Time / Vietnam + { 41, 85, 1903 }, // GTB Standard Time / Greece + { 7, 38, 1917 }, // Atlantic Standard Time / Canada + { 5, 103, 1985 }, // Arabic Standard Time / Iraq + { 96, 205, 1998 }, // W. Europe Standard Time / Sweden + { 73, 233, 2015 }, // SA Western Standard Time / BritishVirginIslands + { 3, 186, 2031 }, // Arab Standard Time / SaudiArabia + { 44, 102, 2043 }, // Iran Standard Time / Iran + { 75, 0, 2055 }, // SE Asia Standard Time / AnyCountry + { 82, 0, 2065 }, // Tokyo Standard Time / AnyCountry + { 40, 136, 2075 }, // Greenwich Standard Time / Mauritania + { 69, 21, 2093 }, // Romance Standard Time / Belgium + { 42, 225, 2109 }, // Hawaiian Standard Time / UnitedStates + { 95, 3, 2126 }, // W. Central Africa Standard Time / Algeria + { 72, 38, 2141 }, // SA Pacific Standard Time / Canada + { 87, 38, 2163 }, // US Mountain Standard Time / Canada + { 95, 49, 2200 }, // W. Central Africa Standard Time / CongoKinshasa + { 18, 52, 2216 }, // Central America Standard Time / CostaRica + { 23, 140, 2235 }, // Central Pacific Standard Time / Micronesia + { 28, 254, 2265 }, // E. Africa Standard Time / SouthSudan + { 95, 156, 2277 }, // W. Central Africa Standard Time / Niger + { 40, 80, 2291 }, // Greenwich Standard Time / Gambia + { 75, 36, 2305 }, // SE Asia Standard Time / Cambodia + { 69, 197, 2321 }, // Romance Standard Time / Spain + { 97, 218, 2348 }, // West Asia Standard Time / Turkmenistan + { 37, 81, 2362 }, // Georgian Standard Time / Georgia + { 75, 101, 2375 }, // SE Asia Standard Time / Indonesia + { 18, 155, 2403 }, // Central America Standard Time / Nicaragua + { 73, 9, 2419 }, // SA Western Standard Time / AntiguaAndBarbuda + { 76, 101, 2435 }, // Singapore Standard Time / Indonesia + { 98, 167, 2449 }, // West Pacific Standard Time / PapuaNewGuinea + { 25, 0, 2470 }, // Central Standard Time / AnyCountry + { 32, 16, 2478 }, // Eastern Standard Time / Bahamas + { 73, 30, 2493 }, // SA Western Standard Time / Brazil + { 38, 173, 2582 }, // GMT Standard Time / Portugal + { 74, 183, 2613 }, // Samoa Standard Time / Samoa + { 60, 154, 2626 }, // New Zealand Standard Time / NewZealand + { 33, 64, 2643 }, // Egypt Standard Time / Egypt + { 73, 19, 2656 }, // SA Western Standard Time / Barbados + { 71, 8, 2673 }, // SA Eastern Standard Time / Antarctica + { 97, 209, 2692 }, // West Asia Standard Time / Tajikistan + { 77, 0, 2706 }, // South Africa Standard Time / AnyCountry + { 42, 226, 2716 }, // Hawaiian Standard Time / UnitedStatesMinorOutlyingIslands + { 28, 210, 2733 }, // E. Africa Standard Time / Tanzania + { 95, 37, 2754 }, // W. Central Africa Standard Time / Cameroon + { 58, 148, 2768 }, // Namibia Standard Time / Namibia + { 34, 178, 2784 }, // Ekaterinburg Standard Time / Russia + { 28, 221, 2803 }, // E. Africa Standard Time / Uganda + { 28, 138, 2818 }, // E. Africa Standard Time / Mayotte + { 40, 92, 2833 }, // Greenwich Standard Time / GuineaBissau + { 97, 78, 2847 }, // West Asia Standard Time / FrenchSouthernTerritories + { 77, 240, 2864 }, // South Africa Standard Time / Zimbabwe + { 95, 79, 2878 }, // W. Central Africa Standard Time / Gabon + { 76, 190, 2896 }, // Singapore Standard Time / Singapore + { 15, 0, 2911 }, // Cape Verde Standard Time / AnyCountry + { 89, 226, 2921 }, // UTC-11 / UnitedStatesMinorOutlyingIslands + { 24, 139, 2936 }, // Central Standard Time (Mexico) / Mexico + { 78, 198, 3027 }, // Sri Lanka Standard Time / SriLanka + { 36, 222, 3040 }, // FLE Standard Time / Ukraine + { 32, 225, 3104 }, // Eastern Standard Time / UnitedStates + { 9, 13, 3261 }, // AUS Eastern Standard Time / Australia + { 32, 0, 3298 }, // Eastern Standard Time / AnyCountry + { 73, 244, 3306 }, // SA Western Standard Time / Saint Barthelemy + { 3, 115, 3328 }, // Arab Standard Time / Kuwait + { 95, 41, 3340 }, // W. Central Africa Standard Time / CentralAfricanRepublic + { 95, 0, 3354 }, // W. Central Africa Standard Time / AnyCountry + { 72, 107, 3364 }, // SA Pacific Standard Time / Jamaica + { 68, 168, 3380 }, // Paraguay Standard Time / Paraguay + { 73, 182, 3397 }, // SA Western Standard Time / SaintVincentAndTheGrenadines + { 96, 82, 3416 }, // W. Europe Standard Time / Germany + { 66, 225, 3430 }, // Pacific Standard Time / UnitedStates + { 73, 61, 3450 }, // SA Western Standard Time / DominicanRepublic + { 89, 0, 3472 }, // UTC-11 / AnyCountry + { 19, 110, 3483 }, // Central Asia Standard Time / Kazakhstan + { 29, 13, 3510 }, // E. Australia Standard Time / Australia + { 91, 235, 3548 }, // UTC+12 / WallisAndFutunaIslands + { 13, 25, 3563 }, // Bangladesh Standard Time / Bhutan + { 54, 139, 3576 }, // Mountain Standard Time (Mexico) / Mexico + { 73, 152, 3611 }, // SA Western Standard Time / CuraSao + { 97, 8, 3627 }, // West Asia Standard Time / Antarctica + { 59, 150, 3645 }, // Nepal Standard Time / Nepal + { 73, 7, 3659 }, // SA Western Standard Time / Anguilla + { 40, 121, 3676 }, // Greenwich Standard Time / Liberia + { 18, 22, 3692 }, // Central America Standard Time / Belize + { 21, 243, 3707 }, // Central Europe Standard Time / Serbia + { 4, 162, 3723 }, // Arabian Standard Time / Oman + { 41, 141, 3735 }, // GTB Standard Time / Moldova + { 71, 76, 3751 }, // SA Eastern Standard Time / FrenchGuiana + { 77, 122, 3767 }, // South Africa Standard Time / Libya + { 50, 176, 3782 }, // Mauritius Standard Time / Reunion + { 23, 8, 3797 }, // Central Pacific Standard Time / Antarctica + { 28, 67, 3818 }, // E. Africa Standard Time / Eritrea + { 40, 212, 3832 }, // Greenwich Standard Time / Togo + { 10, 15, 3844 }, // Azerbaijan Standard Time / Azerbaijan + { 8, 13, 3854 }, // AUS Central Standard Time / Australia + { 28, 128, 3871 }, // E. Africa Standard Time / Madagascar + { 55, 0, 3891 }, // Mountain Standard Time / AnyCountry + { 36, 118, 3899 }, // FLE Standard Time / Latvia + { 28, 59, 3911 }, // E. Africa Standard Time / Djibouti + { 23, 193, 3927 }, // Central Pacific Standard Time / SolomonIslands + { 18, 63, 3947 }, // Central America Standard Time / Ecuador + { 76, 170, 3965 }, // Singapore Standard Time / Philippines + { 86, 225, 3977 }, // US Eastern Standard Time / UnitedStates + { 64, 8, 4044 }, // Pacific SA Standard Time / Antarctica + { 4, 223, 4062 }, // Arabian Standard Time / UnitedArabEmirates + { 75, 45, 4073 }, // SE Asia Standard Time / ChristmasIsland + { 91, 0, 4090 }, // UTC+12 / AnyCountry + { 40, 99, 4101 }, // Greenwich Standard Time / Iceland + { 88, 0, 4120 }, // UTC-02 / AnyCountry + { 66, 0, 4130 }, // Pacific Standard Time / AnyCountry + { 38, 75, 4138 }, // GMT Standard Time / Guernsey + { 96, 206, 4154 }, // W. Europe Standard Time / Switzerland + { 71, 70, 4168 }, // SA Eastern Standard Time / FalklandIslands + { 22, 54, 4185 }, // Central European Standard Time / Croatia + { 66, 139, 4199 }, // Pacific Standard Time / Mexico + { 82, 164, 4215 }, // Tokyo Standard Time / Palau + { 2, 225, 4229 }, // Alaskan Standard Time / UnitedStates + { 14, 38, 4305 }, // Canada Central Standard Time / Canada + { 57, 178, 4342 }, // N. Central Asia Standard Time / Russia + { 77, 146, 4387 }, // South Africa Standard Time / Mozambique + { 15, 39, 4401 }, // Cape Verde Standard Time / CapeVerde + { 71, 202, 4421 }, // SA Eastern Standard Time / Suriname + { 38, 252, 4440 }, // GMT Standard Time / Jersey + { 40, 189, 4454 }, // Greenwich Standard Time / SierraLeone + { 92, 231, 4470 }, // Venezuela Standard Time / Venezuela + { 73, 38, 4486 }, // SA Western Standard Time / Canada + { 79, 207, 4507 }, // Syria Standard Time / Syria + { 38, 197, 4521 }, // GMT Standard Time / Spain + { 75, 117, 4537 }, // SE Asia Standard Time / Laos + { 22, 172, 4552 }, // Central European Standard Time / Poland + { 27, 0, 4566 }, // Dateline Standard Time / AnyCountry + { 16, 11, 4577 }, // Caucasus Standard Time / Armenia + { 95, 50, 4590 }, // W. Central Africa Standard Time / CongoBrazzaville + { 76, 32, 4609 }, // Singapore Standard Time / Brunei + { 81, 13, 4621 }, // Tasmania Standard Time / Australia + { 96, 84, 4655 }, // W. Europe Standard Time / Gibraltar + { 72, 0, 4672 }, // SA Pacific Standard Time / AnyCountry + { 94, 8, 4682 }, // W. Australia Standard Time / Antarctica + { 82, 62, 4699 }, // Tokyo Standard Time / EastTimor + { 22, 27, 4709 }, // Central European Standard Time / BosniaAndHerzegowina + { 72, 94, 4725 }, // SA Pacific Standard Time / Haiti + { 64, 43, 4748 }, // Pacific SA Standard Time / Chile + { 66, 38, 4765 }, // Pacific Standard Time / Canada + { 91, 112, 4817 }, // UTC+12 / Kiribati + { 46, 109, 4832 }, // Jordan Standard Time / Jordan + { 84, 217, 4843 }, // Turkey Standard Time / Turkey + { 51, 119, 4859 }, // Middle East Standard Time / Lebanon + { 36, 124, 4871 }, // FLE Standard Time / Lithuania + { 21, 2, 4886 }, // Central Europe Standard Time / Albania + { 95, 23, 4900 }, // W. Central Africa Standard Time / Benin + { 55, 38, 4918 }, // Mountain Standard Time / Canada + { 11, 173, 4992 }, // Azores Standard Time / Portugal + { 28, 69, 5008 }, // E. Africa Standard Time / Ethiopia + { 19, 31, 5027 }, // Central Asia Standard Time / BritishIndianOceanTerritory + { 73, 256, 5041 }, // SA Western Standard Time / SintMaarten + { 38, 104, 5063 }, // GMT Standard Time / Ireland + { 89, 4, 5077 }, // UTC-11 / AmericanSamoa + { 77, 239, 5095 }, // South Africa Standard Time / Zambia + { 21, 98, 5109 }, // Central Europe Standard Time / Hungary + { 11, 86, 5125 }, // Azores Standard Time / Greenland + { 73, 215, 5146 }, // SA Western Standard Time / TrinidadAndTobago + { 77, 195, 5168 }, // South Africa Standard Time / SouthAfrica + { 13, 18, 5188 }, // Bangladesh Standard Time / Bangladesh + { 12, 30, 5199 }, // Bahia Standard Time / Brazil + { 47, 178, 5213 }, // Kaliningrad Standard Time / Russia + { 28, 201, 5232 }, // E. Africa Standard Time / Sudan + { 96, 125, 5248 }, // W. Europe Standard Time / Luxembourg + { 75, 143, 5266 }, // SE Asia Standard Time / Mongolia + { 98, 0, 5276 }, // West Pacific Standard Time / AnyCountry + { 50, 188, 5287 }, // Mauritius Standard Time / Seychelles + { 21, 57, 5299 }, // Central Europe Standard Time / CzechRepublic + { 98, 140, 5313 }, // West Pacific Standard Time / Micronesia + { 90, 86, 5326 }, // UTC / Greenland + { 43, 100, 5347 }, // India Standard Time / India + { 83, 214, 5361 }, // Tonga Standard Time / Tonga + { 96, 142, 5379 }, // W. Europe Standard Time / Monaco + { 73, 181, 5393 }, // SA Western Standard Time / SaintLucia + { 95, 6, 5410 }, // W. Central Africa Standard Time / Angola + { 73, 60, 5424 }, // SA Western Standard Time / Dominica + { 88, 196, 5441 }, // UTC-02 / SouthGeorgiaAndTheSouthSandwichIslands + { 19, 0, 5464 }, // Central Asia Standard Time / AnyCountry + { 77, 28, 5474 }, // South Africa Standard Time / Botswana + { 21, 242, 5490 }, // Central Europe Standard Time / Montenegro + { 98, 89, 5507 }, // West Pacific Standard Time / Guam + { 55, 225, 5520 }, // Mountain Standard Time / UnitedStates + { 53, 145, 5566 }, // Morocco Standard Time / Morocco + { 77, 179, 5584 }, // South Africa Standard Time / Rwanda + { 7, 86, 5598 }, // Atlantic Standard Time / Greenland + { 30, 56, 5612 }, // E. Europe Standard Time / Cyprus + { 49, 178, 5625 }, // Magadan Standard Time / Russia + { 72, 169, 5665 }, // SA Pacific Standard Time / Peru + { 77, 204, 5678 }, // South Africa Standard Time / Swaziland + { 3, 17, 5693 }, // Arab Standard Time / Bahrain + { 73, 174, 5706 }, // SA Western Standard Time / PuertoRico + { 77, 49, 5726 }, // South Africa Standard Time / CongoKinshasa + { 75, 8, 5744 }, // SE Asia Standard Time / Antarctica + { 91, 149, 5761 }, // UTC+12 / Nauru + { 40, 83, 5775 }, // Greenwich Standard Time / Ghana + { 75, 211, 5788 }, // SE Asia Standard Time / Thailand + { 96, 230, 5801 }, // W. Europe Standard Time / VaticanCityState + { 71, 30, 5816 }, // SA Eastern Standard Time / Brazil + { 69, 58, 5913 }, // Romance Standard Time / Denmark + { 25, 225, 5931 }, // Central Standard Time / UnitedStates + { 73, 245, 6099 }, // SA Western Standard Time / Saint Martin + { 91, 134, 6115 }, // UTC+12 / MarshallIslands + { 45, 105, 6148 }, // Israel Standard Time / Israel + { 73, 12, 6163 }, // SA Western Standard Time / Aruba + { 67, 163, 6177 }, // Pakistan Standard Time / Pakistan + { 40, 185, 6190 }, // Greenwich Standard Time / SaoTomeAndPrincipe + { 48, 113, 6206 }, // Korea Standard Time / NorthKorea + { 93, 178, 6221 }, // Vladivostok Standard Time / Russia + { 40, 34, 6252 }, // Greenwich Standard Time / BurkinaFaso + { 77, 129, 6271 }, // South Africa Standard Time / Malawi + { 42, 51, 6287 }, // Hawaiian Standard Time / CookIslands + { 28, 0, 6305 }, // E. Africa Standard Time / AnyCountry + { 40, 53, 6315 }, // Greenwich Standard Time / IvoryCoast + { 38, 224, 6330 }, // GMT Standard Time / UnitedKingdom + { 18, 90, 6344 }, // Central America Standard Time / Guatemala + { 35, 72, 6362 }, // Fiji Standard Time / Fiji + { 72, 40, 6375 }, // SA Pacific Standard Time / CaymanIslands + { 62, 178, 6390 }, // North Asia East Standard Time / Russia + { 96, 106, 6403 }, // W. Europe Standard Time / Italy + { 50, 137, 6415 }, // Mauritius Standard Time / Mauritius + { 4, 0, 6432 }, // Arabian Standard Time / AnyCountry + { 71, 0, 6442 }, // SA Eastern Standard Time / AnyCountry + { 40, 91, 6452 }, // Greenwich Standard Time / Guinea + { 65, 139, 6467 }, // Pacific Standard Time (Mexico) / Mexico + { 40, 187, 6488 }, // Greenwich Standard Time / Senegal + { 83, 213, 6501 }, // Tonga Standard Time / Tokelau + { 96, 5, 6517 }, // W. Europe Standard Time / Andorra + { 96, 161, 6532 }, // W. Europe Standard Time / Norway + { 3, 175, 6544 }, // Arab Standard Time / Qatar + { 56, 147, 6555 }, // Myanmar Standard Time / Myanmar + { 97, 131, 6568 }, // West Asia Standard Time / Maldives + { 69, 74, 6584 }, // Romance Standard Time / France + { 3, 237, 6597 }, // Arab Standard Time / Yemen + { 63, 178, 6607 }, // North Asia Standard Time / Russia + { 96, 14, 6624 }, // W. Europe Standard Time / Austria + { 76, 0, 6638 }, // Singapore Standard Time / AnyCountry + { 83, 0, 6648 }, // Tonga Standard Time / AnyCountry + { 96, 203, 6659 }, // W. Europe Standard Time / SvalbardAndJanMayenIslands + { 73, 87, 6679 }, // SA Western Standard Time / Grenada + { 73, 234, 6695 }, // SA Western Standard Time / UnitedStatesVirginIslands + { 33, 165, 6713 }, // Egypt Standard Time / PalestinianTerritories + { 99, 178, 6735 }, // Yakutsk Standard Time / Russia + { 21, 191, 6748 }, // Central Europe Standard Time / Slovakia + { 23, 0, 6766 }, // Central Pacific Standard Time / AnyCountry + { 95, 66, 6777 }, // W. Central Africa Standard Time / EquatorialGuinea + { 73, 255, 6791 }, // SA Western Standard Time / Bonaire + { 97, 0, 6810 }, // West Asia Standard Time / AnyCountry + { 22, 127, 6820 }, // Central European Standard Time / Macedonia + { 95, 42, 6834 }, // W. Central Africa Standard Time / Chad + { 19, 116, 6850 }, // Central Asia Standard Time / Kyrgyzstan + { 0, 0, 0 } // Trailing zeroes +}; + +// Windows ID Key, Windows ID Index, Olsen ID Index, UTC Offset +static const QWindowsData windowsDataTable[] = { + { 1, 0, 997, 16200 }, // Afghanistan Standard Time + { 2, 26, 6863,-32400 }, // Alaskan Standard Time + { 3, 48, 2031, 10800 }, // Arab Standard Time + { 4, 67, 4062, 14400 }, // Arabian Standard Time + { 5, 89, 1985, 10800 }, // Arabic Standard Time + { 6, 110, 6881, 10800 }, // Argentina Standard Time + { 7, 134, 6902,-14400 }, // Atlantic Standard Time + { 8, 157, 3854, 34200 }, // AUS Central Standard Time + { 9, 183, 6918, 36000 }, // AUS Eastern Standard Time + { 10, 209, 3844, 14400 }, // Azerbaijan Standard Time + { 11, 234, 4992, -3600 }, // Azores Standard Time + { 12, 255, 5199, 10800 }, // Bahia Standard Time + { 13, 275, 5188, 21600 }, // Bangladesh Standard Time + { 14, 300, 6935,-21600 }, // Canada Central Standard Time + { 15, 329, 4401, -3600 }, // Cape Verde Standard Time + { 16, 354, 4577, 14400 }, // Caucasus Standard Time + { 17, 377, 6950, 34200 }, // Cen. Australia Standard Time + { 18, 406, 6344,-21600 }, // Central America Standard Time + { 19, 436, 6969, 21600 }, // Central Asia Standard Time + { 20, 463, 6981,-14400 }, // Central Brazilian Standard Time + { 21, 495, 5109, 3600 }, // Central Europe Standard Time + { 22, 524, 4552, 3600 }, // Central European Standard Time + { 23, 555, 3927, 39600 }, // Central Pacific Standard Time + { 24, 585, 6996,-21600 }, // Central Standard Time (Mexico) + { 25, 616, 7016,-21600 }, // Central Standard Time + { 26, 638, 7032, 28800 }, // China Standard Time + { 27, 658, 4566,-43200 }, // Dateline Standard Time + { 28, 681, 1615, 10800 }, // E. Africa Standard Time + { 29, 705, 7046, 36000 }, // E. Australia Standard Time + { 30, 732, 5612, 7200 }, // E. Europe Standard Time + { 31, 756, 1362,-10800 }, // E. South America Standard Time + { 32, 787, 7065,-18000 }, // Eastern Standard Time + { 33, 809, 2643, 7200 }, // Egypt Standard Time + { 34, 829, 2784, 21600 }, // Ekaterinburg Standard Time + { 35, 856, 6362, 43200 }, // Fiji Standard Time + { 36, 875, 7082, 7200 }, // FLE Standard Time + { 37, 893, 2362, 14400 }, // Georgian Standard Time + { 38, 916, 6330, 0 }, // GMT Standard Time + { 39, 934, 1814, 10800 }, // Greenland Standard Time + { 40, 958, 4101, 0 }, // Greenwich Standard Time + { 41, 982, 1008, 7200 }, // GTB Standard Time + { 42, 1000, 2109,-36000 }, // Hawaiian Standard Time + { 43, 1023, 5347, 19800 }, // India Standard Time + { 44, 1043, 2043, 12600 }, // Iran Standard Time + { 45, 1062, 6148, 7200 }, // Israel Standard Time + { 46, 1083, 4832, 7200 }, // Jordan Standard Time + { 47, 1104, 5213, 10800 }, // Kaliningrad Standard Time + { 48, 1130, 849, 32400 }, // Korea Standard Time + { 49, 1150, 7094, 43200 }, // Magadan Standard Time + { 50, 1172, 6415, 14400 }, // Mauritius Standard Time + { 51, 1196, 4859, 7200 }, // Middle East Standard Time + { 52, 1222, 1106, 10800 }, // Montevideo Standard Time + { 53, 1247, 5566, 0 }, // Morocco Standard Time + { 54, 1269, 7107,-25200 }, // Mountain Standard Time (Mexico) + { 55, 1301, 7125,-25200 }, // Mountain Standard Time + { 56, 1324, 6555, 23400 }, // Myanmar Standard Time + { 57, 1346, 7140, 23400 }, // N. Central Asia Standard Time + { 58, 1376, 2768, 3600 }, // Namibia Standard Time + { 59, 1398, 3645, 20700 }, // Nepal Standard Time + { 60, 1418, 2626, 43200 }, // New Zealand Standard Time + { 61, 1444, 257,-12600 }, // Newfoundland Standard Time + { 62, 1471, 6390, 32400 }, // North Asia East Standard Time + { 63, 1501, 6607, 28800 }, // North Asia Standard Time + { 64, 1526, 4748,-14400 }, // Pacific SA Standard Time + { 65, 1551, 6467,-28800 }, // Pacific Standard Time (Mexico) + { 66, 1582, 3430,-28800 }, // Pacific Standard Time + { 67, 1604, 6177, 18000 }, // Pakistan Standard Time + { 68, 1627, 3380,-14400 }, // Paraguay Standard Time + { 69, 1650, 6584, 3600 }, // Romance Standard Time + { 70, 1672, 7157, 14400 }, // Russian Standard Time + { 71, 1694, 3751, 10800 }, // SA Eastern Standard Time + { 72, 1719, 228,-18000 }, // SA Pacific Standard Time + { 73, 1744, 1025,-14400 }, // SA Western Standard Time + { 74, 1769, 2613, 46800 }, // Samoa Standard Time + { 75, 1789, 5788, 23400 }, // SE Asia Standard Time + { 76, 1811, 2896, 28800 }, // Singapore Standard Time + { 77, 1835, 5168, 7200 }, // South Africa Standard Time + { 78, 1862, 3027, 19800 }, // Sri Lanka Standard Time + { 79, 1886, 4507, 7200 }, // Syria Standard Time + { 80, 1906, 142, 28800 }, // Taipei Standard Time + { 81, 1927, 7171, 36000 }, // Tasmania Standard Time + { 82, 1950, 1846, 32400 }, // Tokyo Standard Time + { 83, 1970, 5361, 46800 }, // Tonga Standard Time + { 84, 1990, 4843, 7200 }, // Turkey Standard Time + { 85, 2011, 7188, 28800 }, // Ulaanbaatar Standard Time + { 86, 2037, 7205,-18000 }, // US Eastern Standard Time + { 87, 2062, 1690,-25200 }, // US Mountain Standard Time + { 88, 2088, 4120, -7200 }, // UTC-02 + { 89, 2095, 3472,-39600 }, // UTC-11 + { 90, 2102, 927, 0 }, // UTC + { 91, 2106, 4090, 43200 }, // UTC+12 + { 92, 2113, 4470,-16200 }, // Venezuela Standard Time + { 93, 2137, 7226, 39600 }, // Vladivostok Standard Time + { 94, 2163, 870, 28800 }, // W. Australia Standard Time + { 95, 2190, 0, 3600 }, // W. Central Africa Standard Time + { 96, 2222, 3416, 3600 }, // W. Europe Standard Time + { 97, 2246, 7243, 18000 }, // West Asia Standard Time + { 98, 2270, 2449, 36000 }, // West Pacific Standard Time + { 99, 2297, 6735, 36000 }, // Yakutsk Standard Time + { 0, 0, 0, 0 } // Trailing zeroes +}; + +// Olsen ID Index, UTC Offset +static const QUtcData utcDataTable[] = { + { 7257, 0 }, // UTC + { 7261,-50400 }, // UTC-14:00 + { 7271,-46800 }, // UTC-13:00 + { 7281,-43200 }, // UTC-12:00 + { 7291,-39600 }, // UTC-11:00 + { 7301,-36000 }, // UTC-10:00 + { 7311,-32400 }, // UTC-09:00 + { 7321,-28800 }, // UTC-08:00 + { 7331,-25200 }, // UTC-07:00 + { 7341,-21600 }, // UTC-06:00 + { 7351,-18000 }, // UTC-05:00 + { 7361,-16200 }, // UTC-04:30 + { 7371,-14400 }, // UTC-04:00 + { 7381,-12600 }, // UTC-03:30 + { 7391,-10800 }, // UTC-03:00 + { 7401, -7200 }, // UTC-02:00 + { 7411, -3600 }, // UTC-01:00 + { 7421, 0 }, // UTC-00:00 + { 7431, 0 }, // UTC+00:00 + { 7441, 3600 }, // UTC+01:00 + { 7451, 7200 }, // UTC+02:00 + { 7461, 10800 }, // UTC+03:00 + { 7471, 12600 }, // UTC+03:30 + { 7481, 14400 }, // UTC+04:00 + { 7491, 16200 }, // UTC+04:30 + { 7501, 18000 }, // UTC+05:00 + { 7511, 19800 }, // UTC+05:30 + { 7521, 20700 }, // UTC+05:45 + { 7531, 21600 }, // UTC+06:00 + { 7541, 23400 }, // UTC+06:30 + { 7551, 25200 }, // UTC+07:00 + { 7561, 28800 }, // UTC+08:00 + { 7571, 32400 }, // UTC+09:00 + { 7581, 34200 }, // UTC+09:30 + { 7591, 36000 }, // UTC+10:00 + { 7601, 39600 }, // UTC+11:00 + { 7611, 43200 }, // UTC+12:00 + { 7621, 46800 }, // UTC+13:00 + { 7631, 50400 }, // UTC+14:00 + { 0, 0 } // Trailing zeroes +}; + +static const char windowsIdData[] = { +0x41, 0x66, 0x67, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, +0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x6c, 0x61, 0x73, 0x6b, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, +0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x61, 0x62, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, +0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x61, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, +0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x61, 0x62, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, +0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x20, +0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, +0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x55, 0x53, +0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, +0x6d, 0x65, 0x0, 0x41, 0x55, 0x53, 0x20, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, +0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x7a, 0x65, 0x72, 0x62, 0x61, 0x69, 0x6a, 0x61, 0x6e, 0x20, +0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x7a, 0x6f, 0x72, 0x65, 0x73, +0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x42, 0x61, 0x68, 0x69, 0x61, +0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x42, 0x61, 0x6e, 0x67, 0x6c, +0x61, 0x64, 0x65, 0x73, 0x68, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, +0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, +0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x61, 0x70, 0x65, 0x20, 0x56, 0x65, 0x72, 0x64, 0x65, 0x20, +0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x61, 0x75, 0x63, 0x61, 0x73, +0x75, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, +0x2e, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, +0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, +0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, +0x72, 0x61, 0x6c, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, +0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x42, 0x72, 0x61, 0x7a, 0x69, 0x6c, 0x69, 0x61, 0x6e, +0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, +0x61, 0x6c, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, +0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x61, 0x6e, +0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, +0x61, 0x6c, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, +0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, +0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x29, 0x0, 0x43, 0x65, 0x6e, 0x74, +0x72, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x68, +0x69, 0x6e, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x44, 0x61, +0x74, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, +0x0, 0x45, 0x2e, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, +0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x2e, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x20, 0x53, 0x74, +0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x2e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, +0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x2e, 0x20, 0x53, +0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, +0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, +0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x67, 0x79, 0x70, 0x74, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, +0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x6b, 0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75, 0x72, +0x67, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x46, 0x69, 0x6a, 0x69, +0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x46, 0x4c, 0x45, 0x20, 0x53, +0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x65, 0x6f, 0x72, 0x67, 0x69, 0x61, +0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x4d, 0x54, 0x20, +0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x72, 0x65, 0x65, 0x6e, 0x6c, +0x61, 0x6e, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x72, +0x65, 0x65, 0x6e, 0x77, 0x69, 0x63, 0x68, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, +0x65, 0x0, 0x47, 0x54, 0x42, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, +0x48, 0x61, 0x77, 0x61, 0x69, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, +0x6d, 0x65, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, +0x6d, 0x65, 0x0, 0x49, 0x72, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, +0x65, 0x0, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, +0x6d, 0x65, 0x0, 0x4a, 0x6f, 0x72, 0x64, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, +0x69, 0x6d, 0x65, 0x0, 0x4b, 0x61, 0x6c, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x72, 0x61, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6e, +0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4b, 0x6f, 0x72, 0x65, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, +0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x61, 0x67, 0x61, 0x64, 0x61, 0x6e, 0x20, 0x53, 0x74, +0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75, +0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x69, 0x64, 0x64, +0x6c, 0x65, 0x20, 0x45, 0x61, 0x73, 0x74, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, +0x65, 0x0, 0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, +0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x6f, 0x72, 0x6f, 0x63, 0x63, 0x6f, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, +0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x74, +0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x29, +0x0, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, +0x69, 0x6d, 0x65, 0x0, 0x4d, 0x79, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, +0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x2e, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x73, 0x69, +0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x61, 0x6d, 0x69, +0x62, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x65, +0x70, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x65, +0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, +0x69, 0x6d, 0x65, 0x0, 0x4e, 0x65, 0x77, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x74, 0x61, +0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x41, 0x73, 0x69, +0x61, 0x20, 0x45, 0x61, 0x73, 0x74, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, +0x0, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, +0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x41, 0x20, 0x53, 0x74, 0x61, +0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, +0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, +0x29, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, +0x69, 0x6d, 0x65, 0x0, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, +0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x50, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x20, 0x53, 0x74, 0x61, 0x6e, +0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x52, 0x6f, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x53, 0x74, +0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x6e, 0x20, +0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x41, 0x20, 0x45, 0x61, 0x73, +0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, +0x41, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, +0x69, 0x6d, 0x65, 0x0, 0x53, 0x41, 0x20, 0x57, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, +0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, +0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x45, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, +0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, +0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x6f, 0x75, 0x74, 0x68, +0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, +0x65, 0x0, 0x53, 0x72, 0x69, 0x20, 0x4c, 0x61, 0x6e, 0x6b, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, +0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x79, 0x72, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, +0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x61, 0x69, 0x70, 0x65, 0x69, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, +0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x61, 0x73, 0x6d, 0x61, 0x6e, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, +0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x6f, 0x6b, 0x79, 0x6f, 0x20, 0x53, 0x74, 0x61, 0x6e, +0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, +0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x75, 0x72, 0x6b, 0x65, 0x79, 0x20, 0x53, 0x74, 0x61, +0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x55, 0x6c, 0x61, 0x61, 0x6e, 0x62, 0x61, 0x61, 0x74, +0x61, 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x55, 0x53, 0x20, +0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, +0x65, 0x0, 0x55, 0x53, 0x20, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, +0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x32, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, +0x31, 0x0, 0x55, 0x54, 0x43, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x32, 0x0, 0x56, 0x65, 0x6e, 0x65, 0x7a, 0x75, 0x65, +0x6c, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x56, 0x6c, 0x61, +0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, +0x6d, 0x65, 0x0, 0x57, 0x2e, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, +0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x2e, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, +0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, +0x65, 0x0, 0x57, 0x2e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, +0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x65, 0x73, 0x74, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, +0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x65, 0x73, 0x74, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, +0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x59, 0x61, 0x6b, +0x75, 0x74, 0x73, 0x6b, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0 +}; + +static const char olsenIdData[] = { +0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x61, 0x67, 0x6f, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, +0x48, 0x65, 0x6c, 0x73, 0x69, 0x6e, 0x6b, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x6e, 0x67, 0x5f, 0x4b, +0x6f, 0x6e, 0x67, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x6e, 0x64, 0x65, 0x72, 0x62, 0x75, 0x72, +0x79, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x0, 0x41, +0x73, 0x69, 0x61, 0x2f, 0x4a, 0x61, 0x79, 0x61, 0x70, 0x75, 0x72, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, +0x54, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x79, 0x61, +0x6e, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x73, 0x65, 0x72, 0x72, 0x61, +0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x69, 0x70, 0x65, 0x69, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, +0x2f, 0x53, 0x61, 0x6e, 0x5f, 0x4d, 0x61, 0x72, 0x69, 0x6e, 0x6f, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, +0x61, 0x2f, 0x41, 0x64, 0x65, 0x6c, 0x61, 0x69, 0x64, 0x65, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, +0x2f, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x48, 0x69, 0x6c, 0x6c, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, 0x67, 0x6f, +0x74, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x6d, 0x61, 0x6b, 0x6f, 0x0, 0x41, 0x6d, 0x65, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x54, 0x65, 0x67, 0x75, 0x63, 0x69, 0x67, 0x61, 0x6c, 0x70, 0x61, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, +0x2f, 0x43, 0x6f, 0x6d, 0x6f, 0x72, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x6c, 0x61, 0x61, 0x6e, 0x62, 0x61, +0x61, 0x74, 0x61, 0x72, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x68, 0x6f, 0x69, 0x62, 0x61, 0x6c, 0x73, 0x61, 0x6e, +0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4b, 0x69, 0x74, 0x74, 0x73, 0x0, 0x41, 0x66, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x6c, 0x5f, 0x41, 0x61, 0x69, 0x75, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4f, +0x72, 0x61, 0x6c, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x71, 0x74, 0x61, 0x75, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, +0x41, 0x71, 0x74, 0x6f, 0x62, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x61, 0x68, 0x69, 0x74, +0x69, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, 0x65, 0x6e, 0x6f, 0x73, 0x5f, 0x41, 0x69, 0x72, +0x65, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, +0x2f, 0x4c, 0x61, 0x5f, 0x52, 0x69, 0x6f, 0x6a, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, +0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x52, 0x69, 0x6f, 0x5f, 0x47, 0x61, 0x6c, 0x6c, 0x65, 0x67, 0x6f, 0x73, +0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x53, +0x61, 0x6c, 0x74, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, +0x6e, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x5f, 0x4a, 0x75, 0x61, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x5f, 0x4c, 0x75, 0x69, 0x73, 0x20, 0x41, +0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x54, 0x75, 0x63, +0x75, 0x6d, 0x61, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, +0x6e, 0x61, 0x2f, 0x55, 0x73, 0x68, 0x75, 0x61, 0x69, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, +0x61, 0x74, 0x61, 0x6d, 0x61, 0x72, 0x63, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x72, +0x64, 0x6f, 0x62, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x75, 0x6a, 0x75, 0x79, 0x20, 0x41, +0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x6e, 0x64, 0x6f, 0x7a, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x43, 0x75, 0x69, 0x61, 0x62, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, +0x6d, 0x70, 0x6f, 0x5f, 0x47, 0x72, 0x61, 0x6e, 0x64, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x69, +0x6e, 0x73, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x6f, 0x72, 0x6f, 0x6e, 0x74, 0x6f, 0x20, +0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x71, 0x61, 0x6c, 0x75, 0x69, 0x74, 0x20, 0x41, 0x6d, 0x65, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x72, 0x65, 0x61, 0x6c, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x4e, 0x69, 0x70, 0x69, 0x67, 0x6f, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6e, +0x67, 0x6e, 0x69, 0x72, 0x74, 0x75, 0x6e, 0x67, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x68, 0x75, +0x6e, 0x64, 0x65, 0x72, 0x5f, 0x42, 0x61, 0x79, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x65, 0x6f, 0x75, 0x6c, 0x0, +0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x37, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, +0x50, 0x65, 0x72, 0x74, 0x68, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x6f, 0x75, +0x74, 0x68, 0x5f, 0x50, 0x6f, 0x6c, 0x65, 0x20, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, +0x63, 0x4d, 0x75, 0x72, 0x64, 0x6f, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, +0x65, 0x2f, 0x4d, 0x61, 0x6c, 0x74, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x64, +0x65, 0x6c, 0x6f, 0x75, 0x70, 0x65, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x6f, 0x63, 0x6f, 0x73, 0x0, +0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46, 0x75, 0x6e, 0x61, 0x66, 0x75, 0x74, 0x69, 0x0, 0x41, 0x73, 0x69, +0x61, 0x2f, 0x4b, 0x61, 0x62, 0x75, 0x6c, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x63, 0x68, 0x61, +0x72, 0x65, 0x73, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x61, 0x5f, 0x50, 0x61, 0x7a, 0x0, +0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x6f, 0x6e, 0x68, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, +0x70, 0x65, 0x2f, 0x56, 0x61, 0x64, 0x75, 0x7a, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x74, +0x61, 0x6d, 0x6f, 0x72, 0x6f, 0x73, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x74, 0x5f, 0x48, +0x65, 0x6c, 0x65, 0x6e, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x76, +0x69, 0x64, 0x65, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4f, 0x6a, 0x69, 0x6e, 0x61, 0x67, 0x61, +0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x75, 0x6d, 0x6f, 0x6e, 0x74, 0x44, 0x55, +0x72, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x72, 0x69, 0x65, 0x68, +0x61, 0x6d, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x6e, 0x69, 0x70, 0x65, 0x67, +0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x61, 0x69, 0x6e, 0x79, 0x5f, 0x52, 0x69, 0x76, 0x65, 0x72, +0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x5f, 0x49, 0x6e, 0x6c, 0x65, +0x74, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x0, 0x41, +0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x61, 0x6e, 0x64, 0x5f, 0x54, 0x75, 0x72, 0x6b, 0x0, 0x41, 0x6d, +0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x79, 0x61, 0x71, 0x75, 0x69, 0x6c, 0x0, 0x41, 0x73, 0x69, 0x61, +0x2f, 0x53, 0x68, 0x61, 0x6e, 0x67, 0x68, 0x61, 0x69, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x68, 0x6f, 0x6e, 0x67, +0x71, 0x69, 0x6e, 0x67, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x61, 0x72, 0x62, 0x69, 0x6e, 0x20, 0x41, 0x73, 0x69, +0x61, 0x2f, 0x4b, 0x61, 0x73, 0x68, 0x67, 0x61, 0x72, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x72, 0x75, 0x6d, 0x71, +0x69, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6f, 0x5f, 0x50, 0x61, 0x75, 0x6c, 0x6f, 0x0, +0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x75, 0x6e, 0x69, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, +0x73, 0x68, 0x6b, 0x65, 0x6e, 0x74, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x6e, +0x64, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x30, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, +0x69, 0x63, 0x61, 0x2f, 0x53, 0x79, 0x6f, 0x77, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6f, 0x66, +0x69, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x6c, 0x5f, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x64, +0x6f, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x61, 0x6c, 0x61, 0x5f, 0x4c, 0x75, 0x6d, 0x70, 0x75, 0x72, +0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, +0x54, 0x2b, 0x34, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x73, 0x63, 0x6f, 0x77, 0x20, 0x45, 0x75, +0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x6d, 0x61, 0x72, 0x61, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, +0x6f, 0x6c, 0x67, 0x6f, 0x67, 0x72, 0x61, 0x64, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x69, 0x75, +0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x73, 0x65, 0x72, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x48, 0x65, 0x72, 0x6d, 0x6f, 0x73, 0x69, 0x6c, 0x6c, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x4e, 0x61, 0x69, 0x72, 0x6f, 0x62, 0x69, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x53, 0x61, +0x69, 0x70, 0x61, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x67, 0x61, 0x64, 0x69, 0x73, 0x68, +0x75, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x61, 0x75, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, +0x41, 0x6d, 0x73, 0x74, 0x65, 0x72, 0x64, 0x61, 0x6d, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x68, +0x6f, 0x65, 0x6e, 0x69, 0x78, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, 0x73, 0x6c, 0x65, 0x5f, 0x6f, 0x66, +0x5f, 0x4d, 0x61, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x57, 0x61, 0x6b, 0x65, 0x0, 0x50, 0x61, +0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x6f, 0x75, 0x6d, 0x65, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, +0x63, 0x61, 0x2f, 0x56, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x36, 0x0, +0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x66, 0x61, 0x74, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x47, 0x6f, 0x64, 0x74, 0x68, 0x61, 0x62, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x46, +0x61, 0x65, 0x72, 0x6f, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x6f, 0x6b, 0x79, 0x6f, 0x0, 0x45, 0x75, 0x72, +0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x6a, 0x75, 0x62, 0x6c, 0x6a, 0x61, 0x6e, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x42, 0x75, 0x6a, 0x75, 0x6d, 0x62, 0x75, 0x72, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x69, 0x67, +0x6f, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x74, 0x68, 0x65, 0x6e, 0x73, 0x0, 0x41, 0x6d, 0x65, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x6c, 0x69, 0x66, 0x61, 0x78, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x47, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x42, 0x61, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, +0x6f, 0x6f, 0x73, 0x65, 0x5f, 0x42, 0x61, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, +0x63, 0x74, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x67, 0x68, 0x64, 0x61, 0x64, 0x0, 0x45, 0x75, +0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x74, 0x6f, 0x63, 0x6b, 0x68, 0x6f, 0x6c, 0x6d, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x54, 0x6f, 0x72, 0x74, 0x6f, 0x6c, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x52, 0x69, 0x79, 0x61, +0x64, 0x68, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x65, 0x68, 0x72, 0x61, 0x6e, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, +0x4d, 0x54, 0x2d, 0x37, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x39, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x4e, 0x6f, 0x75, 0x61, 0x6b, 0x63, 0x68, 0x6f, 0x74, 0x74, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, +0x42, 0x72, 0x75, 0x73, 0x73, 0x65, 0x6c, 0x73, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x48, 0x6f, 0x6e, +0x6f, 0x6c, 0x75, 0x6c, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6c, 0x67, 0x69, 0x65, 0x72, 0x73, +0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x72, 0x61, 0x6c, 0x5f, 0x48, 0x61, 0x72, 0x62, 0x6f, +0x75, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x77, 0x73, 0x6f, 0x6e, 0x5f, 0x43, 0x72, +0x65, 0x65, 0x6b, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x6e, 0x0, +0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61, 0x73, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x73, 0x74, 0x61, 0x5f, 0x52, 0x69, 0x63, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, +0x69, 0x63, 0x2f, 0x50, 0x6f, 0x6e, 0x61, 0x70, 0x65, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4b, 0x6f, +0x73, 0x72, 0x61, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x75, 0x62, 0x61, 0x0, 0x41, 0x66, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x4e, 0x69, 0x61, 0x6d, 0x65, 0x79, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, +0x6e, 0x6a, 0x75, 0x6c, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x68, 0x6e, 0x6f, 0x6d, 0x5f, 0x50, 0x65, 0x6e, 0x68, +0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x64, 0x72, 0x69, 0x64, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x43, 0x65, 0x75, 0x74, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x73, 0x68, 0x67, 0x61, 0x62, 0x61, +0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x62, 0x69, 0x6c, 0x69, 0x73, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, +0x4a, 0x61, 0x6b, 0x61, 0x72, 0x74, 0x61, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x6f, 0x6e, 0x74, 0x69, 0x61, 0x6e, +0x61, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x75, 0x61, 0x0, 0x41, +0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x74, 0x69, 0x67, 0x75, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, +0x4d, 0x61, 0x6b, 0x61, 0x73, 0x73, 0x61, 0x72, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x6f, 0x72, +0x74, 0x5f, 0x4d, 0x6f, 0x72, 0x65, 0x73, 0x62, 0x79, 0x0, 0x43, 0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x0, 0x41, 0x6d, +0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x61, 0x73, 0x73, 0x61, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x4d, 0x61, 0x6e, 0x61, 0x75, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, 0x61, 0x5f, +0x56, 0x69, 0x73, 0x74, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x69, 0x72, 0x75, 0x6e, 0x65, +0x70, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x5f, 0x56, 0x65, 0x6c, +0x68, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x69, 0x6f, 0x5f, 0x42, 0x72, 0x61, 0x6e, 0x63, +0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x69, 0x73, 0x62, 0x6f, 0x6e, 0x20, 0x41, 0x74, 0x6c, 0x61, +0x6e, 0x74, 0x69, 0x63, 0x2f, 0x4d, 0x61, 0x64, 0x65, 0x69, 0x72, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, +0x2f, 0x41, 0x70, 0x69, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x41, 0x75, 0x63, 0x6b, 0x6c, 0x61, +0x6e, 0x64, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x6f, 0x73, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, +0x69, 0x63, 0x61, 0x2f, 0x52, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x75, 0x73, +0x68, 0x61, 0x6e, 0x62, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x32, 0x0, 0x50, 0x61, 0x63, 0x69, +0x66, 0x69, 0x63, 0x2f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x74, 0x6f, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x44, 0x61, 0x72, 0x5f, 0x65, 0x73, 0x5f, 0x53, 0x61, 0x6c, 0x61, 0x61, 0x6d, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x44, 0x6f, 0x75, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x64, 0x68, +0x6f, 0x65, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x65, 0x6b, 0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75, +0x72, 0x67, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x70, 0x61, 0x6c, 0x61, 0x0, 0x49, 0x6e, +0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x79, 0x6f, 0x74, 0x74, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x42, 0x69, 0x73, 0x73, 0x61, 0x75, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4b, 0x65, 0x72, 0x67, 0x75, 0x65, +0x6c, 0x65, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x72, 0x61, 0x72, 0x65, 0x0, 0x41, 0x66, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, 0x62, 0x72, 0x65, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, +0x2f, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, +0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x69, 0x64, 0x77, 0x61, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x5f, 0x43, 0x69, 0x74, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x68, 0x69, 0x61, 0x5f, 0x42, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x73, 0x20, 0x41, +0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x6e, 0x63, 0x75, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x4d, 0x65, 0x72, 0x69, 0x64, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, +0x74, 0x65, 0x72, 0x72, 0x65, 0x79, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x6f, 0x0, +0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x69, 0x65, 0x76, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, +0x69, 0x6d, 0x66, 0x65, 0x72, 0x6f, 0x70, 0x6f, 0x6c, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x55, 0x7a, 0x68, +0x67, 0x6f, 0x72, 0x6f, 0x64, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x61, 0x70, 0x6f, 0x72, 0x6f, 0x7a, +0x68, 0x79, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x65, 0x77, 0x5f, 0x59, 0x6f, 0x72, 0x6b, +0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x65, 0x74, 0x72, 0x6f, 0x69, 0x74, 0x20, 0x41, 0x6d, 0x65, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x50, 0x65, 0x74, 0x65, 0x72, 0x73, 0x62, +0x75, 0x72, 0x67, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, +0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, +0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x61, 0x6d, 0x61, 0x63, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x4b, 0x65, 0x6e, 0x74, 0x75, 0x63, 0x6b, 0x79, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x69, 0x63, 0x65, 0x6c, 0x6c, +0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x75, 0x69, 0x73, 0x76, 0x69, 0x6c, 0x6c, 0x65, +0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x53, 0x79, 0x64, 0x6e, 0x65, 0x79, 0x20, 0x41, 0x75, +0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x4d, 0x65, 0x6c, 0x62, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x0, 0x45, 0x53, +0x54, 0x35, 0x45, 0x44, 0x54, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x42, 0x61, 0x72, +0x74, 0x68, 0x65, 0x6c, 0x65, 0x6d, 0x79, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x77, 0x61, 0x69, 0x74, 0x0, +0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x6e, 0x67, 0x75, 0x69, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, +0x54, 0x2d, 0x31, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x0, +0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x73, 0x75, 0x6e, 0x63, 0x69, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x0, 0x45, 0x75, 0x72, 0x6f, +0x70, 0x65, 0x2f, 0x42, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, +0x73, 0x5f, 0x41, 0x6e, 0x67, 0x65, 0x6c, 0x65, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, +0x6e, 0x74, 0x6f, 0x5f, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, +0x31, 0x31, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6c, 0x6d, 0x61, 0x74, 0x79, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, +0x51, 0x79, 0x7a, 0x79, 0x6c, 0x6f, 0x72, 0x64, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, +0x42, 0x72, 0x69, 0x73, 0x62, 0x61, 0x6e, 0x65, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x4c, +0x69, 0x6e, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x57, 0x61, 0x6c, 0x6c, +0x69, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x68, 0x69, 0x6d, 0x70, 0x68, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x4d, 0x61, 0x7a, 0x61, 0x74, 0x6c, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, +0x75, 0x72, 0x61, 0x63, 0x61, 0x6f, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, +0x77, 0x73, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x74, 0x6d, 0x61, 0x6e, 0x64, 0x75, 0x0, 0x41, +0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x72, 0x6f, 0x76, 0x69, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x6c, 0x67, 0x72, 0x61, +0x64, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x75, 0x73, 0x63, 0x61, 0x74, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, +0x65, 0x2f, 0x43, 0x68, 0x69, 0x73, 0x69, 0x6e, 0x61, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, +0x61, 0x79, 0x65, 0x6e, 0x6e, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x72, 0x69, 0x70, 0x6f, 0x6c, +0x69, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x52, 0x65, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x0, 0x41, 0x6e, 0x74, +0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x71, 0x75, 0x61, 0x72, 0x69, 0x65, 0x0, 0x41, 0x66, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x73, 0x6d, 0x65, 0x72, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, +0x6f, 0x6d, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x6b, 0x75, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, +0x6c, 0x69, 0x61, 0x2f, 0x44, 0x61, 0x72, 0x77, 0x69, 0x6e, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x41, 0x6e, +0x74, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x76, 0x6f, 0x0, 0x4d, 0x53, 0x54, 0x37, 0x4d, 0x44, 0x54, 0x0, 0x45, +0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x69, 0x67, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6a, +0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x64, 0x61, +0x6c, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x61, 0x6c, 0x61, 0x70, +0x61, 0x67, 0x6f, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x69, 0x6c, 0x61, 0x0, 0x41, 0x6d, 0x65, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x20, 0x41, 0x6d, +0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x65, 0x6e, 0x67, +0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x56, 0x65, +0x76, 0x61, 0x79, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6c, 0x6d, 0x65, +0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x75, 0x62, 0x61, 0x69, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, +0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x32, +0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x52, 0x65, 0x79, 0x6b, 0x6a, 0x61, 0x76, 0x69, 0x6b, 0x0, +0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x32, 0x0, 0x50, 0x53, 0x54, 0x38, 0x50, 0x44, 0x54, 0x0, 0x45, 0x75, +0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, 0x75, 0x65, 0x72, 0x6e, 0x73, 0x65, 0x79, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, +0x2f, 0x5a, 0x75, 0x72, 0x69, 0x63, 0x68, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x74, 0x61, +0x6e, 0x6c, 0x65, 0x79, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x61, 0x67, 0x72, 0x65, 0x62, 0x0, 0x41, +0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x69, 0x6a, 0x75, 0x61, 0x6e, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, +0x69, 0x63, 0x2f, 0x50, 0x61, 0x6c, 0x61, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x63, +0x68, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x75, 0x6e, 0x65, 0x61, +0x75, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x6d, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x53, 0x69, 0x74, 0x6b, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x59, 0x61, 0x6b, +0x75, 0x74, 0x61, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x65, 0x67, 0x69, 0x6e, 0x61, 0x20, +0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x77, 0x69, 0x66, 0x74, 0x5f, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, +0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x73, 0x69, 0x62, 0x69, 0x72, 0x73, 0x6b, 0x20, 0x41, +0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x6b, 0x75, 0x7a, 0x6e, 0x65, 0x74, 0x73, 0x6b, 0x20, 0x41, 0x73, 0x69, +0x61, 0x2f, 0x4f, 0x6d, 0x73, 0x6b, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x70, 0x75, 0x74, 0x6f, +0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, 0x61, 0x70, 0x65, 0x5f, 0x56, 0x65, 0x72, 0x64, 0x65, +0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x72, 0x69, 0x62, 0x6f, 0x0, +0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x46, 0x72, 0x65, 0x65, 0x74, 0x6f, 0x77, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, +0x72, 0x61, 0x63, 0x61, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6c, 0x61, 0x6e, 0x63, 0x2d, +0x53, 0x61, 0x62, 0x6c, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x61, 0x6d, 0x61, 0x73, 0x63, 0x75, 0x73, +0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x0, 0x41, 0x73, 0x69, +0x61, 0x2f, 0x56, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6e, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x57, +0x61, 0x72, 0x73, 0x61, 0x77, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x32, 0x0, 0x41, 0x73, 0x69, +0x61, 0x2f, 0x59, 0x65, 0x72, 0x65, 0x76, 0x61, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x72, 0x61, +0x7a, 0x7a, 0x61, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, +0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x62, 0x61, 0x72, 0x74, 0x20, 0x41, 0x75, +0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x43, 0x75, 0x72, 0x72, 0x69, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, +0x65, 0x2f, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, +0x35, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x73, 0x65, 0x79, 0x0, 0x41, +0x73, 0x69, 0x61, 0x2f, 0x44, 0x69, 0x6c, 0x69, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x72, 0x61, +0x6a, 0x65, 0x76, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x2d, 0x61, 0x75, +0x2d, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, +0x69, 0x61, 0x67, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x56, 0x61, 0x6e, 0x63, 0x6f, 0x75, 0x76, +0x65, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x77, 0x73, 0x6f, 0x6e, 0x20, 0x41, 0x6d, +0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x68, 0x69, 0x74, 0x65, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x0, 0x50, 0x61, 0x63, +0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x61, 0x72, 0x61, 0x77, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6d, 0x6d, +0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, 0x73, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x6c, 0x0, 0x41, +0x73, 0x69, 0x61, 0x2f, 0x42, 0x65, 0x69, 0x72, 0x75, 0x74, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, +0x6c, 0x6e, 0x69, 0x75, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x54, 0x69, 0x72, 0x61, 0x6e, 0x65, 0x0, +0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x2d, 0x4e, 0x6f, 0x76, 0x6f, 0x0, 0x41, 0x6d, +0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x64, 0x6d, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x42, 0x61, 0x79, 0x20, 0x41, 0x6d, 0x65, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x75, 0x76, 0x69, 0x6b, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6b, 0x6e, 0x69, 0x66, 0x65, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, +0x2f, 0x41, 0x7a, 0x6f, 0x72, 0x65, 0x73, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x64, 0x64, 0x69, 0x73, +0x5f, 0x41, 0x62, 0x61, 0x62, 0x61, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x68, 0x61, 0x67, 0x6f, 0x73, +0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x50, 0x72, 0x69, 0x6e, 0x63, +0x65, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x44, 0x75, 0x62, 0x6c, 0x69, 0x6e, 0x0, 0x50, 0x61, 0x63, +0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x61, 0x67, 0x6f, 0x5f, 0x50, 0x61, 0x67, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x4c, 0x75, 0x73, 0x61, 0x6b, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x64, 0x61, +0x70, 0x65, 0x73, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x62, +0x79, 0x73, 0x75, 0x6e, 0x64, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f, 0x6f, +0x66, 0x5f, 0x53, 0x70, 0x61, 0x69, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x6f, 0x68, 0x61, 0x6e, +0x6e, 0x65, 0x73, 0x62, 0x75, 0x72, 0x67, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x68, 0x61, 0x6b, 0x61, 0x0, 0x41, +0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x68, 0x69, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, +0x4b, 0x61, 0x6c, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x72, 0x61, 0x64, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, +0x68, 0x61, 0x72, 0x74, 0x6f, 0x75, 0x6d, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x75, 0x78, 0x65, 0x6d, +0x62, 0x6f, 0x75, 0x72, 0x67, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x76, 0x64, 0x0, 0x45, 0x74, 0x63, 0x2f, +0x47, 0x4d, 0x54, 0x2d, 0x31, 0x30, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x68, 0x65, 0x0, 0x45, +0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x72, 0x61, 0x67, 0x75, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, +0x2f, 0x54, 0x72, 0x75, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x6e, 0x6d, 0x61, 0x72, +0x6b, 0x73, 0x68, 0x61, 0x76, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x74, 0x74, 0x61, +0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x74, 0x61, 0x70, 0x75, 0x0, 0x45, +0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x53, 0x74, 0x5f, 0x4c, 0x75, 0x63, 0x69, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x61, +0x6e, 0x64, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, +0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x5f, 0x47, 0x65, 0x6f, 0x72, +0x67, 0x69, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x36, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x47, 0x61, 0x62, 0x6f, 0x72, 0x6f, 0x6e, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x6f, 0x64, +0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x6d, 0x0, +0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x42, 0x6f, 0x69, 0x73, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x68, 0x69, +0x70, 0x72, 0x6f, 0x63, 0x6b, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x73, 0x61, 0x62, 0x6c, 0x61, +0x6e, 0x63, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x67, 0x61, 0x6c, 0x69, 0x0, 0x41, 0x6d, +0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x68, 0x75, 0x6c, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x69, 0x63, +0x6f, 0x73, 0x69, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x67, 0x61, 0x64, 0x61, 0x6e, 0x20, 0x41, 0x73, +0x69, 0x61, 0x2f, 0x41, 0x6e, 0x61, 0x64, 0x79, 0x72, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x63, 0x68, +0x61, 0x74, 0x6b, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, 0x6d, 0x61, 0x0, 0x41, 0x66, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x62, 0x61, 0x62, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, +0x68, 0x72, 0x61, 0x69, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x75, 0x65, 0x72, 0x74, 0x6f, +0x5f, 0x52, 0x69, 0x63, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x62, 0x75, 0x6d, 0x62, 0x61, +0x73, 0x68, 0x69, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x76, 0x69, 0x73, +0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x61, 0x75, 0x72, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x41, 0x63, 0x63, 0x72, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x6b, +0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x46, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x65, 0x7a, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x41, 0x72, 0x61, 0x67, 0x75, 0x61, 0x69, 0x6e, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x42, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x65, 0x69, 0x6f, +0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x65, 0x63, 0x69, 0x66, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x61, 0x72, 0x65, 0x6d, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, +0x43, 0x6f, 0x70, 0x65, 0x6e, 0x68, 0x61, 0x67, 0x65, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, +0x68, 0x69, 0x63, 0x61, 0x67, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, +0x6e, 0x61, 0x2f, 0x4b, 0x6e, 0x6f, 0x78, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, +0x61, 0x6e, 0x61, 0x2f, 0x54, 0x65, 0x6c, 0x6c, 0x5f, 0x43, 0x69, 0x74, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x4d, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x65, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x4e, 0x6f, 0x72, 0x74, 0x68, 0x5f, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61, 0x2f, 0x42, 0x65, 0x75, 0x6c, 0x61, 0x68, 0x20, +0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x5f, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61, +0x2f, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x74, +0x68, 0x5f, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61, 0x2f, 0x4e, 0x65, 0x77, 0x5f, 0x53, 0x61, 0x6c, 0x65, 0x6d, 0x0, 0x41, +0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x69, 0x67, 0x6f, 0x74, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, +0x69, 0x63, 0x2f, 0x4d, 0x61, 0x6a, 0x75, 0x72, 0x6f, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4b, 0x77, +0x61, 0x6a, 0x61, 0x6c, 0x65, 0x69, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x65, 0x72, 0x75, 0x73, 0x61, 0x6c, +0x65, 0x6d, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x75, 0x62, 0x61, 0x0, 0x41, 0x73, 0x69, +0x61, 0x2f, 0x4b, 0x61, 0x72, 0x61, 0x63, 0x68, 0x69, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6f, +0x5f, 0x54, 0x6f, 0x6d, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x79, 0x6f, 0x6e, 0x67, 0x79, 0x61, 0x6e, 0x67, +0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x20, 0x41, 0x73, +0x69, 0x61, 0x2f, 0x53, 0x61, 0x6b, 0x68, 0x61, 0x6c, 0x69, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4f, +0x75, 0x61, 0x67, 0x61, 0x64, 0x6f, 0x75, 0x67, 0x6f, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6c, +0x61, 0x6e, 0x74, 0x79, 0x72, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x52, 0x61, 0x72, 0x6f, 0x74, +0x6f, 0x6e, 0x67, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x33, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x41, 0x62, 0x69, 0x64, 0x6a, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x6f, 0x6e, +0x64, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6c, +0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46, 0x69, 0x6a, 0x69, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x49, 0x72, 0x6b, 0x75, 0x74, +0x73, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x6f, 0x6d, 0x65, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, +0x6e, 0x2f, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75, 0x73, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, +0x34, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x33, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, +0x6f, 0x6e, 0x61, 0x6b, 0x72, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x61, +0x5f, 0x49, 0x73, 0x61, 0x62, 0x65, 0x6c, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x6b, 0x61, 0x72, +0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46, 0x61, 0x6b, 0x61, 0x6f, 0x66, 0x6f, 0x0, 0x45, 0x75, 0x72, +0x6f, 0x70, 0x65, 0x2f, 0x41, 0x6e, 0x64, 0x6f, 0x72, 0x72, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4f, +0x73, 0x6c, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51, 0x61, 0x74, 0x61, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, +0x52, 0x61, 0x6e, 0x67, 0x6f, 0x6f, 0x6e, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x6c, 0x64, 0x69, +0x76, 0x65, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x61, 0x72, 0x69, 0x73, 0x0, 0x41, 0x73, 0x69, +0x61, 0x2f, 0x41, 0x64, 0x65, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x73, 0x6e, 0x6f, 0x79, 0x61, +0x72, 0x73, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x65, 0x6e, 0x6e, 0x61, 0x0, 0x45, 0x74, +0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x38, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x33, 0x0, 0x41, +0x72, 0x63, 0x74, 0x69, 0x63, 0x2f, 0x4c, 0x6f, 0x6e, 0x67, 0x79, 0x65, 0x61, 0x72, 0x62, 0x79, 0x65, 0x6e, 0x0, 0x41, +0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x54, 0x68, 0x6f, 0x6d, 0x61, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x47, 0x61, +0x7a, 0x61, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x65, 0x62, 0x72, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, +0x59, 0x61, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x72, 0x61, 0x74, 0x69, +0x73, 0x6c, 0x61, 0x76, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x31, 0x0, 0x41, 0x66, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6c, 0x61, 0x62, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, +0x72, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6a, 0x6b, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x35, 0x0, +0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6b, 0x6f, 0x70, 0x6a, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x4e, 0x64, 0x6a, 0x61, 0x6d, 0x65, 0x6e, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x69, 0x73, 0x68, 0x6b, +0x65, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x61, 0x67, 0x65, +0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, 0x65, 0x6e, 0x6f, 0x73, 0x5f, 0x41, 0x69, 0x72, 0x65, +0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x6c, 0x69, 0x66, 0x61, 0x78, 0x0, 0x41, 0x75, +0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x53, 0x79, 0x64, 0x6e, 0x65, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x52, 0x65, 0x67, 0x69, 0x6e, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, +0x41, 0x64, 0x65, 0x6c, 0x61, 0x69, 0x64, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6c, 0x6d, 0x61, 0x74, 0x79, +0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x75, 0x69, 0x61, 0x62, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x5f, 0x43, 0x69, 0x74, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x63, 0x61, 0x67, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x68, 0x61, +0x6e, 0x67, 0x68, 0x61, 0x69, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x69, 0x73, +0x62, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x65, 0x77, 0x5f, 0x59, 0x6f, 0x72, +0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x69, 0x65, 0x76, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, +0x61, 0x67, 0x61, 0x64, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x68, 0x75, +0x61, 0x68, 0x75, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x0, +0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x73, 0x69, 0x62, 0x69, 0x72, 0x73, 0x6b, 0x0, 0x45, 0x75, 0x72, +0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x73, 0x63, 0x6f, 0x77, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, +0x2f, 0x48, 0x6f, 0x62, 0x61, 0x72, 0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x6c, 0x61, 0x61, 0x6e, 0x62, 0x61, +0x61, 0x74, 0x61, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, +0x70, 0x6f, 0x6c, 0x69, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, +0x6f, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x73, 0x68, 0x6b, 0x65, 0x6e, 0x74, 0x0, 0x55, 0x54, 0x43, +0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x34, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x33, 0x3a, 0x30, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x31, 0x3a, 0x30, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x39, 0x3a, 0x30, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x38, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x37, 0x3a, 0x30, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x36, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x35, 0x3a, 0x30, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x34, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x34, 0x3a, 0x30, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x33, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x33, 0x3a, 0x30, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x31, 0x3a, 0x30, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x30, 0x3a, 0x30, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x32, 0x3a, 0x30, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x33, 0x3a, 0x33, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x34, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x34, 0x3a, 0x33, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x35, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x35, 0x3a, 0x33, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x35, 0x3a, 0x34, 0x35, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x36, 0x3a, 0x30, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x36, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x37, 0x3a, 0x30, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x38, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x39, 0x3a, 0x30, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x39, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x30, 0x3a, 0x30, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x32, 0x3a, 0x30, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x34, 0x3a, 0x30, 0x30, +0x0 +}; +// GENERATED PART ENDS HERE + +QT_END_NAMESPACE + +#endif // QTIMEZONEPRIVATE_DATA_P_H diff --git a/src/corelib/tools/qtimezoneprivate_p.h b/src/corelib/tools/qtimezoneprivate_p.h new file mode 100644 index 0000000000..94fb49026f --- /dev/null +++ b/src/corelib/tools/qtimezoneprivate_p.h @@ -0,0 +1,198 @@ +/**************************************************************************** +** +** Copyright (C) 2013 John Layt <jlayt@kde.org> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#ifndef QTIMEZONEPRIVATE_P_H +#define QTIMEZONEPRIVATE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of internal files. This header file may change from version to version +// without notice, or even be removed. +// +// We mean it. +// + +#include "qtimezone.h" +#include "qlocale_p.h" + +QT_BEGIN_NAMESPACE + +class Q_CORE_EXPORT QTimeZonePrivate : public QSharedData +{ +public: + //Version of QTimeZone::OffsetData struct using msecs for efficiency + struct Data { + QString abbreviation; + qint64 atMSecsSinceEpoch; + int offsetFromUtc; + int standardTimeOffset; + int daylightTimeOffset; + }; + typedef QVector<Data> DataList; + + // Create null time zone + QTimeZonePrivate(); + QTimeZonePrivate(const QTimeZonePrivate &other); + virtual ~QTimeZonePrivate(); + + virtual QTimeZonePrivate *clone(); + + bool operator==(const QTimeZonePrivate &other) const; + bool operator!=(const QTimeZonePrivate &other) const; + + bool isValid() const; + + QByteArray id() const; + virtual QLocale::Country country() const; + virtual QString comment() const; + + virtual QString displayName(qint64 atMSecsSinceEpoch, + QTimeZone::NameType nameType, + const QLocale &locale) const; + virtual QString displayName(QTimeZone::TimeType timeType, + QTimeZone::NameType nameType, + const QLocale &locale) const; + virtual QString abbreviation(qint64 atMSecsSinceEpoch) const; + + virtual int offsetFromUtc(qint64 atMSecsSinceEpoch) const; + virtual int standardTimeOffset(qint64 atMSecsSinceEpoch) const; + virtual int daylightTimeOffset(qint64 atMSecsSinceEpoch) const; + + virtual bool hasDaylightTime() const; + virtual bool isDaylightTime(qint64 atMSecsSinceEpoch) const; + + virtual Data data(qint64 forMSecsSinceEpoch) const; + + virtual bool hasTransitions() const; + virtual Data nextTransition(qint64 afterMSecsSinceEpoch) const; + virtual Data previousTransition(qint64 beforeMSecsSinceEpoch) const; + DataList transitions(qint64 fromMSecsSinceEpoch, qint64 toMSecsSinceEpoch) const; + + virtual QByteArray systemTimeZoneId() const; + + virtual QSet<QByteArray> availableTimeZoneIds() const; + virtual QSet<QByteArray> availableTimeZoneIds(QLocale::Country country) const; + virtual QSet<QByteArray> availableTimeZoneIds(int utcOffset) const; + + virtual void serialize(QDataStream &ds) const; + + // Static Utility Methods + static inline qint64 maxMSecs() { return std::numeric_limits<qint64>::max(); } + static inline qint64 minMSecs() { return std::numeric_limits<qint64>::min() + 1; } + static inline qint64 invalidMSecs() { return std::numeric_limits<qint64>::min(); } + static inline qint64 invalidSeconds() { return std::numeric_limits<int>::min(); } + static Data invalidData(); + static QTimeZone::OffsetData invalidOffsetData(); + static QTimeZone::OffsetData toOffsetData(const Data &data); + static bool isValidId(const QByteArray &olsenId); + static QString isoOffsetFormat(int offsetFromUtc); + + static QByteArray olsenIdToWindowsId(const QByteArray &olsenId); + static QByteArray windowsIdToDefaultOlsenId(const QByteArray &windowsId); + static QByteArray windowsIdToDefaultOlsenId(const QByteArray &windowsId, + QLocale::Country country); + static QList<QByteArray> windowsIdToOlsenIds(const QByteArray &windowsId); + static QList<QByteArray> windowsIdToOlsenIds(const QByteArray &windowsId, + QLocale::Country country); + +protected: + QByteArray m_id; +}; + +template<> QTimeZonePrivate *QSharedDataPointer<QTimeZonePrivate>::clone(); + +class Q_AUTOTEST_EXPORT QUtcTimeZonePrivate Q_DECL_FINAL : public QTimeZonePrivate +{ +public: + // Create default UTC time zone + QUtcTimeZonePrivate(); + // Create named time zone + QUtcTimeZonePrivate(const QByteArray &utcId); + // Create offset from UTC + QUtcTimeZonePrivate(int offsetSeconds); + // Create custom offset from UTC + QUtcTimeZonePrivate(const QByteArray &zoneId, int offsetSeconds, const QString &name, + const QString &abbreviation, QLocale::Country country, + const QString &comment); + QUtcTimeZonePrivate(const QUtcTimeZonePrivate &other); + virtual ~QUtcTimeZonePrivate(); + + QTimeZonePrivate *clone(); + + QLocale::Country country() const Q_DECL_OVERRIDE; + QString comment() const Q_DECL_OVERRIDE; + + QString displayName(QTimeZone::TimeType timeType, + QTimeZone::NameType nameType, + const QLocale &locale) const Q_DECL_OVERRIDE; + QString abbreviation(qint64 atMSecsSinceEpoch) const Q_DECL_OVERRIDE; + + int standardTimeOffset(qint64 atMSecsSinceEpoch) const Q_DECL_OVERRIDE; + int daylightTimeOffset(qint64 atMSecsSinceEpoch) const Q_DECL_OVERRIDE; + + QByteArray systemTimeZoneId() const Q_DECL_OVERRIDE; + + QSet<QByteArray> availableTimeZoneIds() const Q_DECL_OVERRIDE; + QSet<QByteArray> availableTimeZoneIds(QLocale::Country country) const Q_DECL_OVERRIDE; + QSet<QByteArray> availableTimeZoneIds(int utcOffset) const Q_DECL_OVERRIDE; + + void serialize(QDataStream &ds) const Q_DECL_OVERRIDE; + +private: + void init(const QByteArray &zoneId); + void init(const QByteArray &zoneId, int offsetSeconds, const QString &name, + const QString &abbreviation, QLocale::Country country, + const QString &comment); + + int m_offsetFromUtc; + QString m_name; + QString m_abbreviation; + QLocale::Country m_country; + QString m_comment; +}; + +QT_END_NAMESPACE + +#endif // QTIMEZONEPRIVATE_P_H diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri index 1f8641c312..5633b638d3 100644 --- a/src/corelib/tools/tools.pri +++ b/src/corelib/tools/tools.pri @@ -59,6 +59,9 @@ HEADERS += \ tools/qstringmatcher.h \ tools/qtextboundaryfinder.h \ tools/qtimeline.h \ + tools/qtimezone.h \ + tools/qtimezoneprivate_p.h \ + tools/qtimezoneprivate_data_p.h \ tools/qelapsedtimer.h \ tools/qunicodetables_p.h \ tools/qunicodetools_p.h \ @@ -104,6 +107,8 @@ SOURCES += \ tools/qstringlist.cpp \ tools/qtextboundaryfinder.cpp \ tools/qtimeline.cpp \ + tools/qtimezone.cpp \ + tools/qtimezoneprivate.cpp \ tools/qunicodetools.cpp \ tools/qvector.cpp \ tools/qvsnprintf.cpp |