From 2e1763d83a1dacfc5b747934fb77fa7cec7bfe47 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 3 Mar 2016 20:20:42 +0100 Subject: Non-associative containers: add range constructors Something nice we'd like to detect for array-backed containers is if the iterator passed is a Contiguous one; if the type is also trivially copyable / Q_PRIMITIVE_TYPE, we could memcpy() the whole range. However, there's no trait in the Standard to detect contiguous iterators (the best approximation would be detecting if the iterator is actually a pointer). Also, it's probably not smart to do the work now for QVector since QVector needs refactoring anyhow, and this work will be lost. QString and QByteArray are left in another commit. [ChangeLog][QtCore][QVector] Added range constructor. [ChangeLog][QtCore][QVarLengthArray] Added range constructor. [ChangeLog][QtCore][QList] Added range constructor. [ChangeLog][QtCore][QStringList] Added range constructor. [ChangeLog][QtCore][QLinkedList] Added range constructor. [ChangeLog][QtCore][QSet] Added range constructor. Change-Id: I220edb796053c9c4d31a6dbdc7efc5fc0f6678f9 Reviewed-by: Milian Wolff --- src/corelib/tools/qcontainertools_impl.h | 93 ++++++++++++++++++++++++++++++++ src/corelib/tools/qlinkedlist.cpp | 8 +++ src/corelib/tools/qlinkedlist.h | 10 ++-- src/corelib/tools/qlist.cpp | 8 +++ src/corelib/tools/qlist.h | 16 +++++- src/corelib/tools/qset.h | 14 +++-- src/corelib/tools/qset.qdoc | 11 ++++ src/corelib/tools/qstringlist.cpp | 7 +++ src/corelib/tools/qstringlist.h | 4 ++ src/corelib/tools/qvarlengtharray.h | 13 +++-- src/corelib/tools/qvarlengtharray.qdoc | 8 +++ src/corelib/tools/qvector.h | 13 +++++ src/corelib/tools/qvector.qdoc | 7 +++ src/corelib/tools/tools.pri | 1 + 14 files changed, 201 insertions(+), 12 deletions(-) create mode 100644 src/corelib/tools/qcontainertools_impl.h (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qcontainertools_impl.h b/src/corelib/tools/qcontainertools_impl.h new file mode 100644 index 0000000000..c2de50b145 --- /dev/null +++ b/src/corelib/tools/qcontainertools_impl.h @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz +** Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/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 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#if 0 +#pragma qt_sync_skip_header_check +#pragma qt_sync_stop_processing +#endif + +#ifndef QCONTAINERTOOLS_IMPL_H +#define QCONTAINERTOOLS_IMPL_H + +#include +#include + +#ifndef Q_QDOC + +QT_BEGIN_NAMESPACE + +namespace QtPrivate +{ +template +using IfIsInputIterator = typename std::enable_if< + std::is_convertible::iterator_category, std::input_iterator_tag>::value, + bool>::type; + +template +using IfIsForwardIterator = typename std::enable_if< + std::is_convertible::iterator_category, std::forward_iterator_tag>::value, + bool>::type; + +template +using IfIsNotForwardIterator = typename std::enable_if< + !std::is_convertible::iterator_category, std::forward_iterator_tag>::value, + bool>::type; + +template = true> +void reserveIfForwardIterator(Container *, InputIterator, InputIterator) +{ +} + +template = true> +void reserveIfForwardIterator(Container *c, ForwardIterator f, ForwardIterator l) +{ + c->reserve(static_cast(std::distance(f, l))); +} +} // namespace QtPrivate + +QT_END_NAMESPACE + +#endif // Q_QDOC + +#endif // QCONTAINERTOOLS_IMPL_H diff --git a/src/corelib/tools/qlinkedlist.cpp b/src/corelib/tools/qlinkedlist.cpp index d9d93862e5..c0450f5cd8 100644 --- a/src/corelib/tools/qlinkedlist.cpp +++ b/src/corelib/tools/qlinkedlist.cpp @@ -153,6 +153,14 @@ const QLinkedListData QLinkedListData::shared_null = { initializer lists. */ +/*! \fn template template QLinkedList::QLinkedList(InputIterator first, InputIterator last) + \since 5.14 + + Constructs a list with the contents in the iterator range [\a first, \a last). + + The value type of \c InputIterator must be convertible to \c T. +*/ + /*! \fn template QLinkedList::~QLinkedList() Destroys the list. References to the values in the list, and all diff --git a/src/corelib/tools/qlinkedlist.h b/src/corelib/tools/qlinkedlist.h index 91367a74b3..83f70deceb 100644 --- a/src/corelib/tools/qlinkedlist.h +++ b/src/corelib/tools/qlinkedlist.h @@ -42,6 +42,7 @@ #include #include +#include #include #include @@ -84,11 +85,14 @@ public: inline QLinkedList(const QLinkedList &l) : d(l.d) { d->ref.ref(); if (!d->sharable) detach(); } #if defined(Q_COMPILER_INITIALIZER_LISTS) inline QLinkedList(std::initializer_list list) - : d(const_cast(&QLinkedListData::shared_null)) + : QLinkedList(list.begin(), list.end()) {} +#endif + template = true> + inline QLinkedList(InputIterator first, InputIterator last) + : QLinkedList() { - std::copy(list.begin(), list.end(), std::back_inserter(*this)); + std::copy(first, last, std::back_inserter(*this)); } -#endif ~QLinkedList(); QLinkedList &operator=(const QLinkedList &); #ifdef Q_COMPILER_RVALUE_REFS diff --git a/src/corelib/tools/qlist.cpp b/src/corelib/tools/qlist.cpp index 6f8084c676..48617f0539 100644 --- a/src/corelib/tools/qlist.cpp +++ b/src/corelib/tools/qlist.cpp @@ -545,6 +545,14 @@ void **QListData::erase(void **xi) \since 5.2 */ +/*! \fn template template QList::QList(InputIterator first, InputIterator last) + \since 5.14 + + Constructs a QList with the contents in the iterator range [\a first, \a last). + + The value type of \c InputIterator must be convertible to \c T. +*/ + /*! \fn template QList QList::mid(int pos, int length) const diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index 77d8df4a88..dfb8a8a4ab 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -46,6 +46,7 @@ #include #include #include +#include #include #include @@ -169,9 +170,11 @@ public: inline void swap(QList &other) noexcept { qSwap(d, other.d); } #ifdef Q_COMPILER_INITIALIZER_LISTS inline QList(std::initializer_list args) - : d(const_cast(&QListData::shared_null)) - { reserve(int(args.size())); std::copy(args.begin(), args.end(), std::back_inserter(*this)); } + : QList(args.begin(), args.end()) {} #endif + template = true> + QList(InputIterator first, InputIterator last); + bool operator==(const QList &l) const; inline bool operator!=(const QList &l) const { return !(*this == l); } @@ -842,6 +845,15 @@ Q_OUTOFLINE_TEMPLATE QList::~QList() dealloc(d); } +template +template > +QList::QList(InputIterator first, InputIterator last) + : QList() +{ + QtPrivate::reserveIfForwardIterator(this, first, last); + std::copy(first, last, std::back_inserter(*this)); +} + template Q_OUTOFLINE_TEMPLATE bool QList::operator==(const QList &l) const { diff --git a/src/corelib/tools/qset.h b/src/corelib/tools/qset.h index aa915f7ed1..7ae715d247 100644 --- a/src/corelib/tools/qset.h +++ b/src/corelib/tools/qset.h @@ -41,6 +41,8 @@ #define QSET_H #include +#include + #ifdef Q_COMPILER_INITIALIZER_LISTS #include #endif @@ -59,12 +61,16 @@ public: inline QSet() noexcept {} #ifdef Q_COMPILER_INITIALIZER_LISTS inline QSet(std::initializer_list list) + : QSet(list.begin(), list.end()) {} +#endif + template = true> + inline QSet(InputIterator first, InputIterator last) { - reserve(int(list.size())); - for (typename std::initializer_list::const_iterator it = list.begin(); it != list.end(); ++it) - insert(*it); + QtPrivate::reserveIfForwardIterator(this, first, last); + for (; first != last; ++first) + insert(*first); } -#endif + // compiler-generated copy/move ctor/assignment operators are fine! // compiler-generated destructor is fine! diff --git a/src/corelib/tools/qset.qdoc b/src/corelib/tools/qset.qdoc index 48863f2399..2e7a5a29ce 100644 --- a/src/corelib/tools/qset.qdoc +++ b/src/corelib/tools/qset.qdoc @@ -113,6 +113,17 @@ compiled in C++11 mode. */ +/*! \fn template template QSet::QSet(InputIterator first, InputIterator last) + \since 5.14 + + Constructs a set with the contents in the iterator range [\a first, \a last). + + The value type of \c InputIterator must be convertible to \c T. + + \note If the range [\a first, \a last) contains duplicate elements, + the first one is retained. +*/ + /*! \fn template void QSet::swap(QSet &other) diff --git a/src/corelib/tools/qstringlist.cpp b/src/corelib/tools/qstringlist.cpp index cc6eaf8ad2..49247d66b8 100644 --- a/src/corelib/tools/qstringlist.cpp +++ b/src/corelib/tools/qstringlist.cpp @@ -847,5 +847,12 @@ int QtPrivate::QStringList_removeDuplicates(QStringList *that) lists. */ + /*! \fn template QStringList::QStringList(InputIterator first, InputIterator last) + \since 5.14 + + Constructs a QStringList with the contents in the iterator range [\a first, \a last). + + The value type of \c InputIterator must be convertible to \c QString. + */ QT_END_NAMESPACE diff --git a/src/corelib/tools/qstringlist.h b/src/corelib/tools/qstringlist.h index 6387161269..5ad01a0658 100644 --- a/src/corelib/tools/qstringlist.h +++ b/src/corelib/tools/qstringlist.h @@ -44,6 +44,7 @@ #define QSTRINGLIST_H #include +#include #include #include #include @@ -109,6 +110,9 @@ public: #ifdef Q_COMPILER_INITIALIZER_LISTS inline QStringList(std::initializer_list args) : QList(args) { } #endif + template = true> + inline QStringList(InputIterator first, InputIterator last) + : QList(first, last) { } QStringList &operator=(const QList &other) { QList::operator=(other); return *this; } diff --git a/src/corelib/tools/qvarlengtharray.h b/src/corelib/tools/qvarlengtharray.h index c03fbb2218..c81af68593 100644 --- a/src/corelib/tools/qvarlengtharray.h +++ b/src/corelib/tools/qvarlengtharray.h @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -71,13 +72,19 @@ public: #ifdef Q_COMPILER_INITIALIZER_LISTS QVarLengthArray(std::initializer_list args) - : a(Prealloc), s(0), ptr(reinterpret_cast(array)) + : QVarLengthArray(args.begin(), args.end()) { - if (args.size()) - append(args.begin(), int(args.size())); } #endif + template = true> + inline QVarLengthArray(InputIterator first, InputIterator last) + : QVarLengthArray() + { + QtPrivate::reserveIfForwardIterator(this, first, last); + std::copy(first, last, std::back_inserter(*this)); + } + inline ~QVarLengthArray() { if (QTypeInfo::isComplex) { T *i = ptr + s; diff --git a/src/corelib/tools/qvarlengtharray.qdoc b/src/corelib/tools/qvarlengtharray.qdoc index bc8df82517..80769e3769 100644 --- a/src/corelib/tools/qvarlengtharray.qdoc +++ b/src/corelib/tools/qvarlengtharray.qdoc @@ -110,6 +110,14 @@ lists. */ +/*! \fn template template QVarLengthArray::QVarLengthArray(InputIterator first, InputIterator last) + \since 5.14 + + Constructs an array with the contents in the iterator range [\a first, \a last). + + The value type of \c InputIterator must be convertible to \c T. +*/ + /*! \fn template QVarLengthArray::~QVarLengthArray() diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h index 096c369e51..6cbf794c6c 100644 --- a/src/corelib/tools/qvector.h +++ b/src/corelib/tools/qvector.h @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -81,6 +82,9 @@ public: inline QVector(std::initializer_list args); QVector &operator=(std::initializer_list args); #endif + template = true> + inline QVector(InputIterator first, InputIterator last); + bool operator==(const QVector &v) const; inline bool operator!=(const QVector &v) const { return !(*this == v); } @@ -557,6 +561,15 @@ QT_WARNING_POP # endif // Q_CC_MSVC #endif // Q_COMPILER_INITIALIZER_LISTS +template +template > +QVector::QVector(InputIterator first, InputIterator last) + : QVector() +{ + QtPrivate::reserveIfForwardIterator(this, first, last); + std::copy(first, last, std::back_inserter(*this)); +} + template void QVector::freeData(Data *x) { diff --git a/src/corelib/tools/qvector.qdoc b/src/corelib/tools/qvector.qdoc index 69bbb5f9a2..cb47d36356 100644 --- a/src/corelib/tools/qvector.qdoc +++ b/src/corelib/tools/qvector.qdoc @@ -243,6 +243,13 @@ lists. */ +/*! \fn template template QVector::QVector(InputIterator first, InputIterator last) + \since 5.14 + + Constructs a vector with the contents in the iterator range [\a first, \a last). + + The value type of \c InputIterator must be convertible to \c T. +*/ /*! \fn template QVector::~QVector() diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri index 995bab694e..5dcb6c9ee0 100644 --- a/src/corelib/tools/tools.pri +++ b/src/corelib/tools/tools.pri @@ -18,6 +18,7 @@ HEADERS += \ tools/qcollator.h \ tools/qcollator_p.h \ tools/qcontainerfwd.h \ + tools/qcontainertools_impl.h \ tools/qcryptographichash.h \ tools/qdatetime.h \ tools/qdatetime_p.h \ -- cgit v1.2.3 From e2906ea5c4b97ca9bb4ebf9710207097c44cc8ce Mon Sep 17 00:00:00 2001 From: Samuel Gaist Date: Thu, 27 Sep 2018 00:19:49 +0200 Subject: QRegExp include cleanup QRegExp includes can be found in several files where there's not even a use of the class. This patch aims to avoid needless includes as well as follow the "include only what you use" moto. This patch removes a QRegExp include from the QStringList header which means that there is likely going to be code breaking since QStringList is used in many places and would get QRegExp in. [ChangeLog][Potentially Source-Incompatible Changes] qstringlist.h no longer includes qregexp.h. Change-Id: I32847532f16e419d4cb735ddc11a26551127e923 Reviewed-by: Thiago Macieira --- src/corelib/tools/qdatetimeparser.cpp | 1 - src/corelib/tools/qstringlist.cpp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qdatetimeparser.cpp b/src/corelib/tools/qdatetimeparser.cpp index e8470f6cde..5d1704daeb 100644 --- a/src/corelib/tools/qdatetimeparser.cpp +++ b/src/corelib/tools/qdatetimeparser.cpp @@ -47,7 +47,6 @@ #if QT_CONFIG(timezone) #include "qtimezone.h" #endif -#include "qregexp.h" #include "qdebug.h" //#define QDATETIMEPARSER_DEBUG diff --git a/src/corelib/tools/qstringlist.cpp b/src/corelib/tools/qstringlist.cpp index 49247d66b8..f6da7b1428 100644 --- a/src/corelib/tools/qstringlist.cpp +++ b/src/corelib/tools/qstringlist.cpp @@ -38,6 +38,7 @@ ****************************************************************************/ #include +#include #include #if QT_CONFIG(regularexpression) # include -- cgit v1.2.3 From 80853afd732aba126caa138ac421b036d2005f8d Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Thu, 23 Aug 2018 18:04:07 +0200 Subject: Add startOfDay() and endOfDay() methods to QDate These methods give the first and last QDateTime values in the given day, for a given time-zone or time-spec. These are usually the relevant midnight, or the millisecond before, except when time-zone transitions (typically DST changes) skip it, when care is needed to select the right moment. Adapted some code to make use of the new API, eliminating some old cruft from qdatetimeparser_p.h in the process. [ChangeLog][QtCore][QDate] Added startOfDay() and endOfDay() methods to provide a QDateTime at the start and end of a given date, taking account of any time skipped by transitions, e.g. a DST spring-forward, which can lead to a day starting at 01:00 or ending just before 23:00. Task-number: QTBUG-64485 Change-Id: I3dd7a34bedfbec8f8af00c43d13f50f99346ecd0 Reviewed-by: Thiago Macieira --- src/corelib/tools/qdatetime.cpp | 271 +++++++++++++++++++++++++++++++++- src/corelib/tools/qdatetime.h | 10 +- src/corelib/tools/qdatetimeparser.cpp | 10 +- src/corelib/tools/qdatetimeparser_p.h | 7 +- 4 files changed, 283 insertions(+), 15 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp index 6fa735dab7..cc98f80feb 100644 --- a/src/corelib/tools/qdatetime.cpp +++ b/src/corelib/tools/qdatetime.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2017 The Qt Company Ltd. +** Copyright (C) 2019 The Qt Company Ltd. ** Copyright (C) 2016 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** @@ -617,6 +617,268 @@ int QDate::weekNumber(int *yearNumber) const return week; } +static bool inDateTimeRange(qint64 jd, bool start) +{ + using Bounds = std::numeric_limits; + if (jd < Bounds::min() + JULIAN_DAY_FOR_EPOCH) + return false; + jd -= JULIAN_DAY_FOR_EPOCH; + const qint64 maxDay = Bounds::max() / MSECS_PER_DAY; + const qint64 minDay = Bounds::min() / MSECS_PER_DAY - 1; + // (Divisions rounded towards zero, as MSECS_PER_DAY has factors other than two.) + // Range includes start of last day and end of first: + if (start) + return jd > minDay && jd <= maxDay; + return jd >= minDay && jd < maxDay; +} + +static QDateTime toEarliest(const QDate &day, const QDateTime &form) +{ + const Qt::TimeSpec spec = form.timeSpec(); + const int offset = (spec == Qt::OffsetFromUTC) ? form.offsetFromUtc() : 0; +#if QT_CONFIG(timezone) + QTimeZone zone; + if (spec == Qt::TimeZone) + zone = form.timeZone(); +#endif + auto moment = [=](QTime time) { + switch (spec) { + case Qt::OffsetFromUTC: return QDateTime(day, time, spec, offset); +#if QT_CONFIG(timezone) + case Qt::TimeZone: return QDateTime(day, time, zone); +#endif + default: return QDateTime(day, time, spec); + } + }; + // Longest routine time-zone transition is 2 hours: + QDateTime when = moment(QTime(2, 0)); + if (!when.isValid()) { + // Noon should be safe ... + when = moment(QTime(12, 0)); + if (!when.isValid()) { + // ... unless it's a 24-hour jump (moving the date-line) + when = moment(QTime(23, 59, 59, 999)); + if (!when.isValid()) + return QDateTime(); + } + } + int high = when.time().msecsSinceStartOfDay() / 60000; + int low = 0; + // Binary chop to the right minute + while (high > low + 1) { + int mid = (high + low) / 2; + QDateTime probe = moment(QTime(mid / 60, mid % 60)); + if (probe.isValid() && probe.date() == day) { + high = mid; + when = probe; + } else { + low = mid; + } + } + return when; +} + +/*! + \since 5.14 + \fn QDateTime QDate::startOfDay(Qt::TimeSpec spec, int offsetSeconds) const + \fn QDateTime QDate::startOfDay(const QTimeZone &zone) const + + Returns the start-moment of the day. Usually, this shall be midnight at the + start of the day: however, if a time-zone transition causes the given date + to skip over that midnight (e.g. a DST spring-forward skipping from the end + of the previous day to 01:00 of the new day), the actual earliest time in + the day is returned. This can only arise when the start-moment is specified + in terms of a time-zone (by passing its QTimeZone as \a zone) or in terms of + local time (by passing Qt::LocalTime as \a spec; this is its default). + + The \a offsetSeconds is ignored unless \a spec is Qt::OffsetFromUTC, when it + gives the implied zone's offset from UTC. As UTC and such zones have no + transitions, the start of the day is QTime(0, 0) in these cases. + + In the rare case of a date that was entirely skipped (this happens when a + zone east of the international date-line switches to being west of it), the + return shall be invalid. Passing Qt::TimeZone as \a spec (instead of + passing a QTimeZone) or passing an invalid time-zone as \a zone will also + produce an invalid result, as shall dates that start outside the range + representable by QDateTime. + + \sa endOfDay() +*/ +QDateTime QDate::startOfDay(Qt::TimeSpec spec, int offsetSeconds) const +{ + if (!inDateTimeRange(jd, true)) + return QDateTime(); + + switch (spec) { + case Qt::TimeZone: // should pass a QTimeZone instead of Qt::TimeZone + qWarning() << "Called QDate::startOfDay(Qt::TimeZone) on" << *this; + return QDateTime(); + case Qt::OffsetFromUTC: + case Qt::UTC: + return QDateTime(*this, QTime(0, 0), spec, offsetSeconds); + + case Qt::LocalTime: + if (offsetSeconds) + qWarning("Ignoring offset (%d seconds) passed with Qt::LocalTime", offsetSeconds); + break; + } + QDateTime when(*this, QTime(0, 0), spec); + if (!when.isValid()) + when = toEarliest(*this, when); + + return when.isValid() ? when : QDateTime(); +} + +#if QT_CONFIG(timezone) +/*! + \overload + \since 5.14 +*/ +QDateTime QDate::startOfDay(const QTimeZone &zone) const +{ + if (!inDateTimeRange(jd, true) || !zone.isValid()) + return QDateTime(); + + QDateTime when(*this, QTime(0, 0), zone); + if (when.isValid()) + return when; + + // The start of the day must have fallen in a spring-forward's gap; find the spring-forward: + if (zone.hasTransitions()) { + QTimeZone::OffsetData tran = zone.previousTransition(QDateTime(*this, QTime(23, 59, 59, 999), zone)); + const QDateTime &at = tran.atUtc.toTimeZone(zone); + if (at.isValid() && at.date() == *this) + return at; + } + + when = toEarliest(*this, when); + return when.isValid() ? when : QDateTime(); +} +#endif // timezone + +static QDateTime toLatest(const QDate &day, const QDateTime &form) +{ + const Qt::TimeSpec spec = form.timeSpec(); + const int offset = (spec == Qt::OffsetFromUTC) ? form.offsetFromUtc() : 0; +#if QT_CONFIG(timezone) + QTimeZone zone; + if (spec == Qt::TimeZone) + zone = form.timeZone(); +#endif + auto moment = [=](QTime time) { + switch (spec) { + case Qt::OffsetFromUTC: return QDateTime(day, time, spec, offset); +#if QT_CONFIG(timezone) + case Qt::TimeZone: return QDateTime(day, time, zone); +#endif + default: return QDateTime(day, time, spec); + } + }; + // Longest routine time-zone transition is 2 hours: + QDateTime when = moment(QTime(21, 59, 59, 999)); + if (!when.isValid()) { + // Noon should be safe ... + when = moment(QTime(12, 0)); + if (!when.isValid()) { + // ... unless it's a 24-hour jump (moving the date-line) + when = moment(QTime(0, 0)); + if (!when.isValid()) + return QDateTime(); + } + } + int high = 24 * 60; + int low = when.time().msecsSinceStartOfDay() / 60000; + // Binary chop to the right minute + while (high > low + 1) { + int mid = (high + low) / 2; + QDateTime probe = moment(QTime(mid / 60, mid % 60, 59, 999)); + if (probe.isValid() && probe.date() == day) { + low = mid; + when = probe; + } else { + high = mid; + } + } + return when; +} + +/*! + \since 5.14 + \fn QDateTime QDate::endOfDay(Qt::TimeSpec spec, int offsetSeconds) const + \fn QDateTime QDate::endOfDay(const QTimeZone &zone) const + + Returns the end-moment of the day. Usually, this is one millisecond before + the midnight at the end of the day: however, if a time-zone transition + causes the given date to skip over that midnight (e.g. a DST spring-forward + skipping from just before 23:00 to the start of the next day), the actual + latest time in the day is returned. This can only arise when the + start-moment is specified in terms of a time-zone (by passing its QTimeZone + as \a zone) or in terms of local time (by passing Qt::LocalTime as \a spec; + this is its default). + + The \a offsetSeconds is ignored unless \a spec is Qt::OffsetFromUTC, when it + gives the implied zone's offset from UTC. As UTC and such zones have no + transitions, the end of the day is QTime(23, 59, 59, 999) in these cases. + + In the rare case of a date that was entirely skipped (this happens when a + zone east of the international date-line switches to being west of it), the + return shall be invalid. Passing Qt::TimeZone as \a spec (instead of + passing a QTimeZone) will also produce an invalid result, as shall dates + that end outside the range representable by QDateTime. + + \sa startOfDay() +*/ +QDateTime QDate::endOfDay(Qt::TimeSpec spec, int offsetSeconds) const +{ + if (!inDateTimeRange(jd, false)) + return QDateTime(); + + switch (spec) { + case Qt::TimeZone: // should pass a QTimeZone instead of Qt::TimeZone + qWarning() << "Called QDate::endOfDay(Qt::TimeZone) on" << *this; + return QDateTime(); + case Qt::UTC: + case Qt::OffsetFromUTC: + return QDateTime(*this, QTime(23, 59, 59, 999), spec, offsetSeconds); + + case Qt::LocalTime: + if (offsetSeconds) + qWarning("Ignoring offset (%d seconds) passed with Qt::LocalTime", offsetSeconds); + break; + } + QDateTime when(*this, QTime(23, 59, 59, 999), spec); + if (!when.isValid()) + when = toLatest(*this, when); + return when.isValid() ? when : QDateTime(); +} + +#if QT_CONFIG(timezone) +/*! + \overload + \since 5.14 +*/ +QDateTime QDate::endOfDay(const QTimeZone &zone) const +{ + if (!inDateTimeRange(jd, false) || !zone.isValid()) + return QDateTime(); + + QDateTime when(*this, QTime(23, 59, 59, 999), zone); + if (when.isValid()) + return when; + + // The end of the day must have fallen in a spring-forward's gap; find the spring-forward: + if (zone.hasTransitions()) { + QTimeZone::OffsetData tran = zone.nextTransition(QDateTime(*this, QTime(0, 0), zone)); + const QDateTime &at = tran.atUtc.toTimeZone(zone); + if (at.isValid() && at.date() == *this) + return at; + } + + when = toLatest(*this, when); + return when.isValid() ? when : QDateTime(); +} +#endif // timezone + #if QT_DEPRECATED_SINCE(5, 11) && QT_CONFIG(textdate) /*! \since 4.5 @@ -1468,7 +1730,8 @@ bool QDate::isLeapYear(int y) \fn QTime::QTime() Constructs a null time object. For a null time, isNull() returns \c true and - isValid() returns \c false. If you need a zero time, use QTime(0, 0). + isValid() returns \c false. If you need a zero time, use QTime(0, 0). For + the start of a day, see QDate::startOfDay(). \sa isNull(), isValid() */ @@ -2392,8 +2655,8 @@ static void msecsToTime(qint64 msecs, QDate *date, QTime *time) qint64 jd = JULIAN_DAY_FOR_EPOCH; qint64 ds = 0; - if (qAbs(msecs) >= MSECS_PER_DAY) { - jd += (msecs / MSECS_PER_DAY); + if (msecs >= MSECS_PER_DAY || msecs <= -MSECS_PER_DAY) { + jd += msecs / MSECS_PER_DAY; msecs %= MSECS_PER_DAY; } diff --git a/src/corelib/tools/qdatetime.h b/src/corelib/tools/qdatetime.h index 51d5dd9759..8873651f17 100644 --- a/src/corelib/tools/qdatetime.h +++ b/src/corelib/tools/qdatetime.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2017 The Qt Company Ltd. +** Copyright (C) 2019 The Qt Company Ltd. ** Copyright (C) 2016 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** @@ -55,6 +55,7 @@ Q_FORWARD_DECLARE_OBJC_CLASS(NSDate); QT_BEGIN_NAMESPACE class QTimeZone; +class QDateTime; class Q_CORE_EXPORT QDate { @@ -81,6 +82,13 @@ public: int daysInYear() const; int weekNumber(int *yearNum = nullptr) const; + QDateTime startOfDay(Qt::TimeSpec spec = Qt::LocalTime, int offsetSeconds = 0) const; + QDateTime endOfDay(Qt::TimeSpec spec = Qt::LocalTime, int offsetSeconds = 0) const; +#if QT_CONFIG(timezone) + QDateTime startOfDay(const QTimeZone &zone) const; + QDateTime endOfDay(const QTimeZone &zone) const; +#endif + #if QT_DEPRECATED_SINCE(5, 10) && QT_CONFIG(textdate) QT_DEPRECATED_X("Use QLocale::monthName or QLocale::standaloneMonthName") static QString shortMonthName(int month, MonthNameType type = DateFormat); diff --git a/src/corelib/tools/qdatetimeparser.cpp b/src/corelib/tools/qdatetimeparser.cpp index 5d1704daeb..e1dc596d2d 100644 --- a/src/corelib/tools/qdatetimeparser.cpp +++ b/src/corelib/tools/qdatetimeparser.cpp @@ -1982,7 +1982,7 @@ QString QDateTimeParser::stateName(State s) const #if QT_CONFIG(datestring) bool QDateTimeParser::fromString(const QString &t, QDate *date, QTime *time) const { - QDateTime val(QDate(1900, 1, 1), QDATETIMEEDIT_TIME_MIN); + QDateTime val(QDate(1900, 1, 1).startOfDay()); const StateNode tmp = parse(t, -1, val, false); if (tmp.state != Acceptable || tmp.conflicts) { return false; @@ -2010,20 +2010,20 @@ QDateTime QDateTimeParser::getMinimum() const { // Cache the most common case if (spec == Qt::LocalTime) { - static const QDateTime localTimeMin(QDATETIMEEDIT_DATE_MIN, QDATETIMEEDIT_TIME_MIN, Qt::LocalTime); + static const QDateTime localTimeMin(QDATETIMEEDIT_DATE_MIN.startOfDay(Qt::LocalTime)); return localTimeMin; } - return QDateTime(QDATETIMEEDIT_DATE_MIN, QDATETIMEEDIT_TIME_MIN, spec); + return QDateTime(QDATETIMEEDIT_DATE_MIN.startOfDay(spec)); } QDateTime QDateTimeParser::getMaximum() const { // Cache the most common case if (spec == Qt::LocalTime) { - static const QDateTime localTimeMax(QDATETIMEEDIT_DATE_MAX, QDATETIMEEDIT_TIME_MAX, Qt::LocalTime); + static const QDateTime localTimeMax(QDATETIMEEDIT_DATE_MAX.endOfDay(Qt::LocalTime)); return localTimeMax; } - return QDateTime(QDATETIMEEDIT_DATE_MAX, QDATETIMEEDIT_TIME_MAX, spec); + return QDateTime(QDATETIMEEDIT_DATE_MAX.endOfDay(spec)); } QString QDateTimeParser::getAmPmText(AmPm ap, Case cs) const diff --git a/src/corelib/tools/qdatetimeparser_p.h b/src/corelib/tools/qdatetimeparser_p.h index e244fed09a..d9e39f0795 100644 --- a/src/corelib/tools/qdatetimeparser_p.h +++ b/src/corelib/tools/qdatetimeparser_p.h @@ -65,14 +65,11 @@ QT_REQUIRE_CONFIG(datetimeparser); -#define QDATETIMEEDIT_TIME_MIN QTime(0, 0, 0, 0) -#define QDATETIMEEDIT_TIME_MAX QTime(23, 59, 59, 999) +#define QDATETIMEEDIT_TIME_MIN QTime(0, 0) // Prefer QDate::startOfDay() +#define QDATETIMEEDIT_TIME_MAX QTime(23, 59, 59, 999) // Prefer QDate::endOfDay() #define QDATETIMEEDIT_DATE_MIN QDate(100, 1, 1) #define QDATETIMEEDIT_COMPAT_DATE_MIN QDate(1752, 9, 14) #define QDATETIMEEDIT_DATE_MAX QDate(9999, 12, 31) -#define QDATETIMEEDIT_DATETIME_MIN QDateTime(QDATETIMEEDIT_DATE_MIN, QDATETIMEEDIT_TIME_MIN) -#define QDATETIMEEDIT_COMPAT_DATETIME_MIN QDateTime(QDATETIMEEDIT_COMPAT_DATE_MIN, QDATETIMEEDIT_TIME_MIN) -#define QDATETIMEEDIT_DATETIME_MAX QDateTime(QDATETIMEEDIT_DATE_MAX, QDATETIMEEDIT_TIME_MAX) #define QDATETIMEEDIT_DATE_INITIAL QDate(2000, 1, 1) QT_BEGIN_NAMESPACE -- cgit v1.2.3 From e6d9617c79ea029cf60c5555a3d7a32bac1cdbf6 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 3 Mar 2016 20:20:42 +0100 Subject: QHash/QMultiHash: add range constructors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QMap and QMultiMap will go in a separate commit, due to QMap's insertion behavior that "reverses" the inserted elements. [ChangeLog][QtCore][QHash] Added range constructor. [ChangeLog][QtCore][QMultiHash] Added range constructor. Change-Id: Icfd0d0afde27792e8439ed6df3e8774696b134d3 Reviewed-by: Edward Welbourne Reviewed-by: Sérgio Martins Reviewed-by: Thiago Macieira --- src/corelib/tools/qcontainertools_impl.h | 43 ++++++++++++++++++++++++++++++++ src/corelib/tools/qhash.cpp | 22 ++++++++++++++++ src/corelib/tools/qhash.h | 43 ++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qcontainertools_impl.h b/src/corelib/tools/qcontainertools_impl.h index c2de50b145..86a16eb32b 100644 --- a/src/corelib/tools/qcontainertools_impl.h +++ b/src/corelib/tools/qcontainertools_impl.h @@ -84,6 +84,49 @@ void reserveIfForwardIterator(Container *c, ForwardIterator f, ForwardIterator l { c->reserve(static_cast(std::distance(f, l))); } + +// for detecting expression validity +template +using void_t = void; + +template > +struct AssociativeIteratorHasKeyAndValue : std::false_type +{ +}; + +template +struct AssociativeIteratorHasKeyAndValue< + Iterator, + void_t().key()), + decltype(std::declval().value())> + > + : std::true_type +{ +}; + +template , typename = void_t<>> +struct AssociativeIteratorHasFirstAndSecond : std::false_type +{ +}; + +template +struct AssociativeIteratorHasFirstAndSecond< + Iterator, + void_t()->first), + decltype(std::declval()->second)> + > + : std::true_type +{ +}; + +template +using IfAssociativeIteratorHasKeyAndValue = + typename std::enable_if::value, bool>::type; + +template +using IfAssociativeIteratorHasFirstAndSecond = + typename std::enable_if::value, bool>::type; + } // namespace QtPrivate QT_END_NAMESPACE diff --git a/src/corelib/tools/qhash.cpp b/src/corelib/tools/qhash.cpp index dd22a38be1..5c7e535c30 100644 --- a/src/corelib/tools/qhash.cpp +++ b/src/corelib/tools/qhash.cpp @@ -1251,6 +1251,17 @@ uint qHash(long double key, uint seed) noexcept compiled in C++11 mode. */ +/*! \fn template template QHash::QHash(InputIterator begin, InputIterator end) + \since 5.14 + + Constructs a hash with a copy of each of the elements in the iterator range + [\a begin, \a end). Either the elements iterated by the range must be + objects with \c{first} and \c{second} data members (like \c{QPair}, + \c{std::pair}, etc.) convertible to \c Key and to \c T respectively; or the + iterators must have \c{key()} and \c{value()} member functions, returning a + key convertible to \c Key and a value convertible to \c T respectively. +*/ + /*! \fn template QHash::QHash(const QHash &other) Constructs a copy of \a other. @@ -2586,6 +2597,17 @@ uint qHash(long double key, uint seed) noexcept \sa operator=() */ +/*! \fn template template QMultiHash::QMultiHash(InputIterator begin, InputIterator end) + \since 5.14 + + Constructs a multi-hash with a copy of each of the elements in the iterator range + [\a begin, \a end). Either the elements iterated by the range must be + objects with \c{first} and \c{second} data members (like \c{QPair}, + \c{std::pair}, etc.) convertible to \c Key and to \c T respectively; or the + iterators must have \c{key()} and \c{value()} member functions, returning a + key convertible to \c Key and a value convertible to \c T respectively. +*/ + /*! \fn template QMultiHash::iterator QMultiHash::replace(const Key &key, const T &value) Inserts a new item with the \a key and a value of \a value. diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h index 120ee9cc85..a757e85386 100644 --- a/src/corelib/tools/qhash.h +++ b/src/corelib/tools/qhash.h @@ -46,6 +46,7 @@ #include #include #include +#include #ifdef Q_COMPILER_INITIALIZER_LISTS #include @@ -258,6 +259,28 @@ public: QHash(QHash &&other) noexcept : d(other.d) { other.d = const_cast(&QHashData::shared_null); } QHash &operator=(QHash &&other) noexcept { QHash moved(std::move(other)); swap(moved); return *this; } +#endif +#ifdef Q_QDOC + template + QHash(InputIterator f, InputIterator l); +#else + template = true> + QHash(InputIterator f, InputIterator l) + : QHash() + { + QtPrivate::reserveIfForwardIterator(this, f, l); + for (; f != l; ++f) + insert(f.key(), f.value()); + } + + template = true> + QHash(InputIterator f, InputIterator l) + : QHash() + { + QtPrivate::reserveIfForwardIterator(this, f, l); + for (; f != l; ++f) + insert(f->first, f->second); + } #endif void swap(QHash &other) noexcept { qSwap(d, other.d); } @@ -1028,6 +1051,26 @@ public: for (typename std::initializer_list >::const_iterator it = list.begin(); it != list.end(); ++it) insert(it->first, it->second); } +#endif +#ifdef Q_QDOC + template + QMultiHash(InputIterator f, InputIterator l); +#else + template = true> + QMultiHash(InputIterator f, InputIterator l) + { + QtPrivate::reserveIfForwardIterator(this, f, l); + for (; f != l; ++f) + insert(f.key(), f.value()); + } + + template = true> + QMultiHash(InputIterator f, InputIterator l) + { + QtPrivate::reserveIfForwardIterator(this, f, l); + for (; f != l; ++f) + insert(f->first, f->second); + } #endif // compiler-generated copy/move ctors/assignment operators are fine! // compiler-generated destructor is fine! -- cgit v1.2.3 From c530ca1c170798159c3d84029841a1224d1cdc65 Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Sun, 3 Mar 2019 12:14:43 +0100 Subject: QLineF: add intersects() as a replacement for intersect() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QLineF::intersect() does not follow the naming rules for functions. Therefore add a replacement function intersects() instead and also rename the return type from IntersectType to IntersectionType [ChangeLog][QtCore][QLineF] added QLineF::intersects() as a replacement for QLineF::intersect() Change-Id: I744b960ea339cb817facb12f296f78cca3e7d938 Reviewed-by: Jędrzej Nowacki Reviewed-by: Konstantin Shegunov --- src/corelib/tools/qline.cpp | 26 +++++++++++++++++++++++++- src/corelib/tools/qline.h | 6 ++++-- 2 files changed, 29 insertions(+), 3 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qline.cpp b/src/corelib/tools/qline.cpp index 6f3c22a6ec..3afd23d76b 100644 --- a/src/corelib/tools/qline.cpp +++ b/src/corelib/tools/qline.cpp @@ -347,7 +347,7 @@ QDataStream &operator>>(QDataStream &stream, QLine &line) function to determine whether the QLineF represents a valid line or a null line. - The intersect() function determines the IntersectType for this + The intersects() function determines the IntersectionType for this line and a given line, while the angleTo() function returns the angle between the lines. In addition, the unitVector() function returns a line that has the same starting point as this line, but @@ -370,6 +370,11 @@ QDataStream &operator>>(QDataStream &stream, QLine &line) /*! \enum QLineF::IntersectType + \obsolete Use QLineF::IntersectionType instead +*/ + +/*! + \enum QLineF::IntersectionType Describes the intersection between two lines. @@ -657,8 +662,10 @@ QLineF QLineF::unitVector() const return f; } +#if QT_DEPRECATED_SINCE(5, 14) /*! \fn QLineF::IntersectType QLineF::intersect(const QLineF &line, QPointF *intersectionPoint) const + \obsolete Use intersects() instead Returns a value indicating whether or not \e this line intersects with the given \a line. @@ -669,6 +676,23 @@ QLineF QLineF::unitVector() const */ QLineF::IntersectType QLineF::intersect(const QLineF &l, QPointF *intersectionPoint) const +{ + return intersects(l, intersectionPoint); +} +#endif + +/*! + \fn QLineF::IntersectionType QLineF::intersects(const QLineF &line, QPointF *intersectionPoint) const + \since 5.14 + + Returns a value indicating whether or not \e this line intersects + with the given \a line. + + The actual intersection point is extracted to \a intersectionPoint + (if the pointer is valid). If the lines are parallel, the + intersection point is undefined. +*/ +QLineF::IntersectionType QLineF::intersects(const QLineF &l, QPointF *intersectionPoint) const { // ipmlementation is based on Graphics Gems III's "Faster Line Segment Intersection" const QPointF a = pt2 - pt1; diff --git a/src/corelib/tools/qline.h b/src/corelib/tools/qline.h index 14980b60a0..c96d624afd 100644 --- a/src/corelib/tools/qline.h +++ b/src/corelib/tools/qline.h @@ -215,6 +215,7 @@ class Q_CORE_EXPORT QLineF { public: enum IntersectType { NoIntersection, BoundedIntersection, UnboundedIntersection }; + using IntersectionType = IntersectType; Q_DECL_CONSTEXPR inline QLineF(); Q_DECL_CONSTEXPR inline QLineF(const QPointF &pt1, const QPointF &pt2); @@ -248,10 +249,11 @@ public: Q_REQUIRED_RESULT QLineF unitVector() const; Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QLineF normalVector() const; - // ### Qt 6: rename intersects() or intersection() and rename IntersectType IntersectionType - IntersectType intersect(const QLineF &l, QPointF *intersectionPoint) const; + IntersectionType intersects(const QLineF &l, QPointF *intersectionPoint) const; #if QT_DEPRECATED_SINCE(5, 14) + QT_DEPRECATED_VERSION_X(5, 14, "Use intersects() instead") + IntersectType intersect(const QLineF &l, QPointF *intersectionPoint) const; QT_DEPRECATED_X("Use angleTo() instead, take care that the return value is between 0 and 360 degree.") qreal angle(const QLineF &l) const; #endif -- cgit v1.2.3 From e0d2b50249839d10ecf87abc296b8020046d1d75 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Tue, 30 Apr 2019 09:44:18 +0200 Subject: QList: do not call std::swap directly; use ADL Change-Id: Iaf6b965dd123f39436ba134ea1065d8dc4278c1e Reviewed-by: Thiago Macieira --- src/corelib/tools/qlist.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index dfb8a8a4ab..48a71b0ecf 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -709,7 +709,8 @@ inline void QList::swapItemsAt(int i, int j) Q_ASSERT_X(i >= 0 && i < p.size() && j >= 0 && j < p.size(), "QList::swap", "index out of range"); detach(); - std::swap(d->array[d->begin + i], d->array[d->begin + j]); + using std::swap; + swap(d->array[d->begin + i], d->array[d->begin + j]); } template -- cgit v1.2.3 From d4435a37cae43abfbdb247b7d4a3a950aced2751 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Tue, 30 Apr 2019 12:39:22 +0200 Subject: Add qobject_cast operators for std::shared_ptr Mimicking what we currently have for QSharedPointer, but also adding * snake_case version (matching the ones in std) * rvalue-overloaded versions (matching the C++2a overloads). [ChangeLog][QtCore][QSharedPointer] Overloads of qSharedPointerObjectCast have been added to work on std::shared_ptr. Change-Id: I26ddffd82b000bf876e7c141fdce86a7b8c1d75a Reviewed-by: Thiago Macieira --- src/corelib/tools/qsharedpointer.cpp | 51 +++++++++++++++++++++++++++++++++ src/corelib/tools/qsharedpointer_impl.h | 42 +++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qsharedpointer.cpp b/src/corelib/tools/qsharedpointer.cpp index 62b76c5bb7..0aedf4c6d6 100644 --- a/src/corelib/tools/qsharedpointer.cpp +++ b/src/corelib/tools/qsharedpointer.cpp @@ -1299,6 +1299,57 @@ \sa QSharedPointer::objectCast(), qSharedPointerCast(), qSharedPointerConstCast() */ +/*! + \fn template std::shared_ptr qSharedPointerObjectCast(const std::shared_ptr &src) + \relates QSharedPointer + \since 5.14 + + Returns a shared pointer to the pointer held by \a src, using a + \l qobject_cast() to type \tt X to obtain an internal pointer of the + appropriate type. If the \tt qobject_cast fails, the object + returned will be null. + + Note that \tt X must have the same cv-qualifiers (\tt const and + \tt volatile) that \tt T has, or the code will fail to + compile. Use const_pointer_cast to cast away the constness. +*/ + +/*! + \fn template std::shared_ptr qobject_pointer_cast(const std::shared_ptr &src) + \relates QSharedPointer + \since 5.14 + + Same as qSharedPointerObjectCast(). This function is provided for STL + compatibility. +*/ + +/*! + \fn template std::shared_ptr qSharedPointerObjectCast(std::shared_ptr &&src) + \relates QSharedPointer + \since 5.14 + + Returns a shared pointer to the pointer held by \a src, using a + \l qobject_cast() to type \tt X to obtain an internal pointer of the + appropriate type. + + If the \tt qobject_cast succeeds, the function will return a valid shared + pointer, and \a src is reset to null. If the \tt qobject_cast fails, the + object returned will be null, and \a src will not be modified. + + Note that \tt X must have the same cv-qualifiers (\tt const and + \tt volatile) that \tt T has, or the code will fail to + compile. Use const_pointer_cast to cast away the constness. +*/ + +/*! + \fn template std::shared_ptr qobject_pointer_cast(std::shared_ptr &&src) + \relates QSharedPointer + \since 5.14 + + Same as qSharedPointerObjectCast(). This function is provided for STL + compatibility. +*/ + /*! \fn template template QSharedPointer qSharedPointerObjectCast(const QWeakPointer &src) \relates QSharedPointer diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index 81d8dcd839..0851121ff2 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -67,6 +67,8 @@ QT_END_NAMESPACE #endif #include +#include + QT_BEGIN_NAMESPACE @@ -996,6 +998,46 @@ qSharedPointerFromVariant(const QVariant &variant) return qSharedPointerObjectCast(QtSharedPointer::sharedPointerFromVariant_internal(variant)); } +// std::shared_ptr helpers + +template +std::shared_ptr qobject_pointer_cast(const std::shared_ptr &src) +{ + using element_type = typename std::shared_ptr::element_type; + return std::shared_ptr(src, qobject_cast(src.get())); +} + +template +std::shared_ptr qobject_pointer_cast(std::shared_ptr &&src) +{ + using element_type = typename std::shared_ptr::element_type; + auto castResult = qobject_cast(src.get()); + if (castResult) { + auto result = std::shared_ptr(std::move(src), castResult); +#if __cplusplus <= 201703L + // C++2a's move aliasing constructor will leave src empty. + // Before C++2a we don't really know if the compiler has support for it. + // The move aliasing constructor is the resolution for LWG2996, + // which does not impose a feature-testing macro. So: clear src. + src.reset(); +#endif + return result; + } + return std::shared_ptr(); +} + +template +std::shared_ptr qSharedPointerObjectCast(const std::shared_ptr &src) +{ + return qobject_pointer_cast(src); +} + +template +std::shared_ptr qSharedPointerObjectCast(std::shared_ptr &&src) +{ + return qobject_pointer_cast(std::move(src)); +} + #endif template Q_DECLARE_TYPEINFO_BODY(QWeakPointer, Q_MOVABLE_TYPE); -- cgit v1.2.3 From b32b61f17eb6f816d854d6177e70df9c9e8fb895 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Tue, 30 Apr 2019 17:16:17 +0200 Subject: Remove handling of missing Q_COMPILER_RVALUE_REFS Remove remaining handling of missing support for rvalue refs. Change-Id: I78bab8bccfeeb9c76f464f345874364a37e4840a Reviewed-by: Edward Welbourne Reviewed-by: Thiago Macieira --- src/corelib/tools/qdatetime.h | 2 -- src/corelib/tools/qeasingcurve.h | 2 -- src/corelib/tools/qhash.h | 4 ---- src/corelib/tools/qlinkedlist.h | 2 -- src/corelib/tools/qlist.h | 2 -- src/corelib/tools/qlocale.h | 2 -- src/corelib/tools/qmap.h | 4 ---- src/corelib/tools/qpair.h | 2 -- src/corelib/tools/qregexp.h | 2 -- src/corelib/tools/qregularexpression.h | 8 -------- src/corelib/tools/qshareddata.h | 4 ---- src/corelib/tools/qsharedpointer_impl.h | 5 ----- src/corelib/tools/qstring.h | 4 ---- src/corelib/tools/qstringlist.h | 4 ---- src/corelib/tools/qtimezone.h | 2 -- src/corelib/tools/qvector.h | 8 -------- src/corelib/tools/qversionnumber.h | 4 ---- 17 files changed, 61 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qdatetime.h b/src/corelib/tools/qdatetime.h index 8873651f17..79fd25d762 100644 --- a/src/corelib/tools/qdatetime.h +++ b/src/corelib/tools/qdatetime.h @@ -278,9 +278,7 @@ public: QDateTime(QDateTime &&other) noexcept; ~QDateTime(); -#ifdef Q_COMPILER_RVALUE_REFS QDateTime &operator=(QDateTime &&other) noexcept { swap(other); return *this; } -#endif QDateTime &operator=(const QDateTime &other) noexcept; void swap(QDateTime &other) noexcept { qSwap(d.d, other.d.d); } diff --git a/src/corelib/tools/qeasingcurve.h b/src/corelib/tools/qeasingcurve.h index 1791f19199..725ddd5dcc 100644 --- a/src/corelib/tools/qeasingcurve.h +++ b/src/corelib/tools/qeasingcurve.h @@ -80,11 +80,9 @@ public: QEasingCurve &operator=(const QEasingCurve &other) { if ( this != &other ) { QEasingCurve copy(other); swap(copy); } return *this; } -#ifdef Q_COMPILER_RVALUE_REFS QEasingCurve(QEasingCurve &&other) noexcept : d_ptr(other.d_ptr) { other.d_ptr = nullptr; } QEasingCurve &operator=(QEasingCurve &&other) noexcept { qSwap(d_ptr, other.d_ptr); return *this; } -#endif void swap(QEasingCurve &other) noexcept { qSwap(d_ptr, other.d_ptr); } diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h index a757e85386..0078bbbee9 100644 --- a/src/corelib/tools/qhash.h +++ b/src/corelib/tools/qhash.h @@ -255,11 +255,9 @@ public: ~QHash() { if (!d->ref.deref()) freeData(d); } QHash &operator=(const QHash &other); -#ifdef Q_COMPILER_RVALUE_REFS QHash(QHash &&other) noexcept : d(other.d) { other.d = const_cast(&QHashData::shared_null); } QHash &operator=(QHash &&other) noexcept { QHash moved(std::move(other)); swap(moved); return *this; } -#endif #ifdef Q_QDOC template QHash(InputIterator f, InputIterator l); @@ -1076,9 +1074,7 @@ public: // compiler-generated destructor is fine! QMultiHash(const QHash &other) : QHash(other) {} -#ifdef Q_COMPILER_RVALUE_REFS QMultiHash(QHash &&other) noexcept : QHash(std::move(other)) {} -#endif void swap(QMultiHash &other) noexcept { QHash::swap(other); } // prevent QMultiHash<->QHash swaps inline typename QHash::iterator replace(const Key &key, const T &value) diff --git a/src/corelib/tools/qlinkedlist.h b/src/corelib/tools/qlinkedlist.h index 83f70deceb..0c8a99e258 100644 --- a/src/corelib/tools/qlinkedlist.h +++ b/src/corelib/tools/qlinkedlist.h @@ -95,12 +95,10 @@ public: } ~QLinkedList(); QLinkedList &operator=(const QLinkedList &); -#ifdef Q_COMPILER_RVALUE_REFS QLinkedList(QLinkedList &&other) noexcept : d(other.d) { other.d = const_cast(&QLinkedListData::shared_null); } QLinkedList &operator=(QLinkedList &&other) noexcept { QLinkedList moved(std::move(other)); swap(moved); return *this; } -#endif inline void swap(QLinkedList &other) noexcept { qSwap(d, other.d); } bool operator==(const QLinkedList &l) const; inline bool operator!=(const QLinkedList &l) const { return !(*this == l); } diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index 48a71b0ecf..59578b1e61 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -161,12 +161,10 @@ public: QList(const QList &l); ~QList(); QList &operator=(const QList &l); -#ifdef Q_COMPILER_RVALUE_REFS inline QList(QList &&other) noexcept : d(other.d) { other.d = const_cast(&QListData::shared_null); } inline QList &operator=(QList &&other) noexcept { QList moved(std::move(other)); swap(moved); return *this; } -#endif inline void swap(QList &other) noexcept { qSwap(d, other.d); } #ifdef Q_COMPILER_INITIALIZER_LISTS inline QList(std::initializer_list args) diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h index 3dc5ee0a01..977c4c6c9c 100644 --- a/src/corelib/tools/qlocale.h +++ b/src/corelib/tools/qlocale.h @@ -939,9 +939,7 @@ public: QLocale(Language language, Country country = AnyCountry); QLocale(Language language, Script script, Country country); QLocale(const QLocale &other); -#ifdef Q_COMPILER_RVALUE_REFS QLocale &operator=(QLocale &&other) noexcept { swap(other); return *this; } -#endif QLocale &operator=(const QLocale &other); ~QLocale(); diff --git a/src/corelib/tools/qmap.h b/src/corelib/tools/qmap.h index 103124f4ad..3b8aad9a33 100644 --- a/src/corelib/tools/qmap.h +++ b/src/corelib/tools/qmap.h @@ -339,7 +339,6 @@ public: inline ~QMap() { if (!d->ref.deref()) d->destroy(); } QMap &operator=(const QMap &other); -#ifdef Q_COMPILER_RVALUE_REFS inline QMap(QMap &&other) noexcept : d(other.d) { @@ -349,7 +348,6 @@ public: inline QMap &operator=(QMap &&other) noexcept { QMap moved(std::move(other)); swap(moved); return *this; } -#endif inline void swap(QMap &other) noexcept { qSwap(d, other.d); } explicit QMap(const typename std::map &other); std::map toStdMap() const; @@ -1196,9 +1194,7 @@ public: } #endif QMultiMap(const QMap &other) : QMap(other) {} -#ifdef Q_COMPILER_RVALUE_REFS QMultiMap(QMap &&other) noexcept : QMap(std::move(other)) {} -#endif void swap(QMultiMap &other) noexcept { QMap::swap(other); } inline typename QMap::iterator replace(const Key &key, const T &value) diff --git a/src/corelib/tools/qpair.h b/src/corelib/tools/qpair.h index 6d1e67efb7..9ebf88bc8f 100644 --- a/src/corelib/tools/qpair.h +++ b/src/corelib/tools/qpair.h @@ -71,7 +71,6 @@ struct QPair noexcept((std::is_nothrow_assignable::value && std::is_nothrow_assignable::value)) { first = p.first; second = p.second; return *this; } -#ifdef Q_COMPILER_RVALUE_REFS template Q_DECL_CONSTEXPR QPair(QPair &&p) noexcept((std::is_nothrow_constructible::value && @@ -83,7 +82,6 @@ struct QPair noexcept((std::is_nothrow_assignable::value && std::is_nothrow_assignable::value)) { first = std::move(p.first); second = std::move(p.second); return *this; } -#endif Q_DECL_RELAXED_CONSTEXPR void swap(QPair &other) noexcept(noexcept(qSwap(other.first, other.first)) && noexcept(qSwap(other.second, other.second))) diff --git a/src/corelib/tools/qregexp.h b/src/corelib/tools/qregexp.h index c043a06496..8f6de24c74 100644 --- a/src/corelib/tools/qregexp.h +++ b/src/corelib/tools/qregexp.h @@ -73,9 +73,7 @@ public: QRegExp(const QRegExp &rx); ~QRegExp(); QRegExp &operator=(const QRegExp &rx); -#ifdef Q_COMPILER_RVALUE_REFS QRegExp &operator=(QRegExp &&other) noexcept { swap(other); return *this; } -#endif void swap(QRegExp &other) noexcept { qSwap(priv, other.priv); } bool operator==(const QRegExp &rx) const; diff --git a/src/corelib/tools/qregularexpression.h b/src/corelib/tools/qregularexpression.h index f16b7e91be..f799a38ae4 100644 --- a/src/corelib/tools/qregularexpression.h +++ b/src/corelib/tools/qregularexpression.h @@ -86,11 +86,8 @@ public: QRegularExpression(const QRegularExpression &re); ~QRegularExpression(); QRegularExpression &operator=(const QRegularExpression &re); - -#ifdef Q_COMPILER_RVALUE_REFS QRegularExpression &operator=(QRegularExpression &&re) noexcept { d.swap(re.d); return *this; } -#endif void swap(QRegularExpression &other) noexcept { d.swap(other.d); } @@ -186,11 +183,8 @@ public: ~QRegularExpressionMatch(); QRegularExpressionMatch(const QRegularExpressionMatch &match); QRegularExpressionMatch &operator=(const QRegularExpressionMatch &match); - -#ifdef Q_COMPILER_RVALUE_REFS QRegularExpressionMatch &operator=(QRegularExpressionMatch &&match) noexcept { d.swap(match.d); return *this; } -#endif void swap(QRegularExpressionMatch &other) noexcept { d.swap(other.d); } QRegularExpression regularExpression() const; @@ -257,10 +251,8 @@ public: ~QRegularExpressionMatchIterator(); QRegularExpressionMatchIterator(const QRegularExpressionMatchIterator &iterator); QRegularExpressionMatchIterator &operator=(const QRegularExpressionMatchIterator &iterator); -#ifdef Q_COMPILER_RVALUE_REFS QRegularExpressionMatchIterator &operator=(QRegularExpressionMatchIterator &&iterator) noexcept { d.swap(iterator.d); return *this; } -#endif void swap(QRegularExpressionMatchIterator &other) noexcept { d.swap(other.d); } bool isValid() const; diff --git a/src/corelib/tools/qshareddata.h b/src/corelib/tools/qshareddata.h index cbaa1aa3c4..04051472d6 100644 --- a/src/corelib/tools/qshareddata.h +++ b/src/corelib/tools/qshareddata.h @@ -112,7 +112,6 @@ public: } return *this; } -#ifdef Q_COMPILER_RVALUE_REFS QSharedDataPointer(QSharedDataPointer &&o) noexcept : d(o.d) { o.d = nullptr; } inline QSharedDataPointer &operator=(QSharedDataPointer &&other) noexcept { @@ -120,7 +119,6 @@ public: swap(moved); return *this; } -#endif inline bool operator!() const { return !d; } @@ -218,7 +216,6 @@ public: } return *this; } -#ifdef Q_COMPILER_RVALUE_REFS inline QExplicitlySharedDataPointer(QExplicitlySharedDataPointer &&o) noexcept : d(o.d) { o.d = nullptr; } inline QExplicitlySharedDataPointer &operator=(QExplicitlySharedDataPointer &&other) noexcept { @@ -226,7 +223,6 @@ public: swap(moved); return *this; } -#endif inline bool operator!() const { return !d; } diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index 0851121ff2..9fb452da6b 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -337,7 +337,6 @@ public: swap(copy); return *this; } -#ifdef Q_COMPILER_RVALUE_REFS QSharedPointer(QSharedPointer &&other) noexcept : value(other.value), d(other.d) { @@ -367,8 +366,6 @@ public: return *this; } -#endif - template QSharedPointer(const QSharedPointer &other) noexcept : value(other.value), d(other.d) { if (d) ref(); } @@ -590,7 +587,6 @@ public: QWeakPointer(const QWeakPointer &other) noexcept : d(other.d), value(other.value) { if (d) d->weakref.ref(); } -#ifdef Q_COMPILER_RVALUE_REFS QWeakPointer(QWeakPointer &&other) noexcept : d(other.d), value(other.value) { @@ -599,7 +595,6 @@ public: } QWeakPointer &operator=(QWeakPointer &&other) noexcept { QWeakPointer moved(std::move(other)); swap(moved); return *this; } -#endif QWeakPointer &operator=(const QWeakPointer &other) noexcept { QWeakPointer copy(other); diff --git a/src/corelib/tools/qstring.h b/src/corelib/tools/qstring.h index a526a6537a..e4798eb51b 100644 --- a/src/corelib/tools/qstring.h +++ b/src/corelib/tools/qstring.h @@ -230,11 +230,9 @@ public: QString &operator=(QChar c); QString &operator=(const QString &) noexcept; QString &operator=(QLatin1String latin1); -#ifdef Q_COMPILER_RVALUE_REFS inline QString(QString && other) noexcept : d(other.d) { other.d = Data::sharedNull(); } inline QString &operator=(QString &&other) noexcept { qSwap(d, other.d); return *this; } -#endif inline void swap(QString &other) noexcept { qSwap(d, other.d); } inline int size() const { return d->size; } inline int count() const { return d->size; } @@ -1437,10 +1435,8 @@ public: QStringRef(const QStringRef &other) noexcept :m_string(other.m_string), m_position(other.m_position), m_size(other.m_size) {} -#ifdef Q_COMPILER_RVALUE_REFS QStringRef(QStringRef &&other) noexcept : m_string(other.m_string), m_position(other.m_position), m_size(other.m_size) {} QStringRef &operator=(QStringRef &&other) noexcept { return *this = other; } -#endif QStringRef &operator=(const QStringRef &other) noexcept { m_string = other.m_string; m_position = other.m_position; diff --git a/src/corelib/tools/qstringlist.h b/src/corelib/tools/qstringlist.h index 5ad01a0658..73ac737643 100644 --- a/src/corelib/tools/qstringlist.h +++ b/src/corelib/tools/qstringlist.h @@ -104,9 +104,7 @@ public: inline QStringList() noexcept { } inline explicit QStringList(const QString &i) { append(i); } inline QStringList(const QList &l) : QList(l) { } -#ifdef Q_COMPILER_RVALUE_REFS inline QStringList(QList &&l) noexcept : QList(std::move(l)) { } -#endif #ifdef Q_COMPILER_INITIALIZER_LISTS inline QStringList(std::initializer_list args) : QList(args) { } #endif @@ -116,10 +114,8 @@ public: QStringList &operator=(const QList &other) { QList::operator=(other); return *this; } -#ifdef Q_COMPILER_RVALUE_REFS QStringList &operator=(QList &&other) noexcept { QList::operator=(std::move(other)); return *this; } -#endif #if QT_STRINGVIEW_LEVEL < 2 inline bool contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; diff --git a/src/corelib/tools/qtimezone.h b/src/corelib/tools/qtimezone.h index ca98986ec1..62ecee49bb 100644 --- a/src/corelib/tools/qtimezone.h +++ b/src/corelib/tools/qtimezone.h @@ -99,9 +99,7 @@ public: ~QTimeZone(); QTimeZone &operator=(const QTimeZone &other); - #ifdef Q_COMPILER_RVALUE_REFS QTimeZone &operator=(QTimeZone &&other) noexcept { swap(other); return *this; } -#endif void swap(QTimeZone &other) noexcept { d.swap(other.d); } diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h index 6cbf794c6c..7e14a0c9b2 100644 --- a/src/corelib/tools/qvector.h +++ b/src/corelib/tools/qvector.h @@ -72,11 +72,9 @@ public: inline QVector(const QVector &v); inline ~QVector() { if (!d->ref.deref()) freeData(d); } QVector &operator=(const QVector &v); -#if defined(Q_COMPILER_RVALUE_REFS) || defined(Q_CLANG_QDOC) QVector(QVector &&other) noexcept : d(other.d) { other.d = Data::sharedNull(); } QVector &operator=(QVector &&other) noexcept { QVector moved(std::move(other)); swap(moved); return *this; } -#endif void swap(QVector &other) noexcept { qSwap(d, other.d); } #ifdef Q_COMPILER_INITIALIZER_LISTS inline QVector(std::initializer_list args); @@ -143,9 +141,7 @@ public: T &operator[](int i); const T &operator[](int i) const; void append(const T &t); -#if defined(Q_COMPILER_RVALUE_REFS) || defined(Q_CLANG_QDOC) void append(T &&t); -#endif inline void append(const QVector &l) { *this += l; } void prepend(T &&t); void prepend(const T &t); @@ -268,10 +264,8 @@ public: typedef const_iterator ConstIterator; typedef int size_type; inline void push_back(const T &t) { append(t); } -#if defined(Q_COMPILER_RVALUE_REFS) || defined(Q_CLANG_QDOC) void push_back(T &&t) { append(std::move(t)); } void push_front(T &&t) { prepend(std::move(t)); } -#endif inline void push_front(const T &t) { prepend(t); } void pop_back() { removeLast(); } void pop_front() { removeFirst(); } @@ -799,7 +793,6 @@ void QVector::append(const T &t) ++d->size; } -#ifdef Q_COMPILER_RVALUE_REFS template void QVector::append(T &&t) { @@ -813,7 +806,6 @@ void QVector::append(T &&t) ++d->size; } -#endif template void QVector::removeLast() diff --git a/src/corelib/tools/qversionnumber.h b/src/corelib/tools/qversionnumber.h index d51947c091..1488014d38 100644 --- a/src/corelib/tools/qversionnumber.h +++ b/src/corelib/tools/qversionnumber.h @@ -119,7 +119,6 @@ class QVersionNumber return *this; } -#ifdef Q_COMPILER_RVALUE_REFS SegmentStorage(SegmentStorage &&other) noexcept : dummy(other.dummy) { @@ -139,7 +138,6 @@ class QVersionNumber else pointer_segments = new QVector(std::move(seg)); } -#endif #ifdef Q_COMPILER_INITIALIZER_LISTS SegmentStorage(std::initializer_list args) { @@ -227,11 +225,9 @@ public: // compiler-generated copy/move ctor/assignment operators and the destructor are ok -#ifdef Q_COMPILER_RVALUE_REFS explicit QVersionNumber(QVector &&seg) : m_segments(std::move(seg)) {} -#endif #ifdef Q_COMPILER_INITIALIZER_LISTS inline QVersionNumber(std::initializer_list args) -- cgit v1.2.3 From c940ca50ce0db76e12b06eb9cefd13c0876c0938 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Tue, 30 Apr 2019 11:55:55 +0200 Subject: Remove spurious class-name prefixes in its own methods Change-Id: I13093e02b251a084e468a50471cf1b9256555e40 Reviewed-by: Jesus Fernandez Reviewed-by: Thiago Macieira --- src/corelib/tools/qlocale_p.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h index 16ded7650c..15398ded32 100644 --- a/src/corelib/tools/qlocale_p.h +++ b/src/corelib/tools/qlocale_p.h @@ -359,9 +359,9 @@ public: QByteArray bcp47Name(char separator = '-') const; - inline QLatin1String languageCode() const { return QLocalePrivate::languageToCode(QLocale::Language(m_data->m_language_id)); } - inline QLatin1String scriptCode() const { return QLocalePrivate::scriptToCode(QLocale::Script(m_data->m_script_id)); } - inline QLatin1String countryCode() const { return QLocalePrivate::countryToCode(QLocale::Country(m_data->m_country_id)); } + inline QLatin1String languageCode() const { return languageToCode(QLocale::Language(m_data->m_language_id)); } + inline QLatin1String scriptCode() const { return scriptToCode(QLocale::Script(m_data->m_script_id)); } + inline QLatin1String countryCode() const { return countryToCode(QLocale::Country(m_data->m_country_id)); } static QLatin1String languageToCode(QLocale::Language language); static QLatin1String scriptToCode(QLocale::Script script); -- cgit v1.2.3 From a2b38f64e6def1538b9d153ec4c6589fa9b6d3c0 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Tue, 30 Apr 2019 17:53:53 +0200 Subject: Remove handling of missing =delete and =default support Change-Id: I006dfd0b7cfa3bda5e5ab01bcefa851f031dfe0e Reviewed-by: Thiago Macieira --- src/corelib/tools/qmap.h | 2 +- src/corelib/tools/qsharedpointer_impl.h | 12 ++++-------- src/corelib/tools/qstringbuilder.h | 4 ++-- 3 files changed, 7 insertions(+), 11 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qmap.h b/src/corelib/tools/qmap.h index 3b8aad9a33..2d01a75a42 100644 --- a/src/corelib/tools/qmap.h +++ b/src/corelib/tools/qmap.h @@ -142,7 +142,7 @@ private: rightNode()->destroySubTree(); } - QMapNode() Q_DECL_EQ_DELETE; + QMapNode() = delete; Q_DISABLE_COPY(QMapNode) }; diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index 9fb452da6b..c219d310dc 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -235,8 +235,8 @@ namespace QtSharedPointer { } private: // prevent construction - ExternalRefCountWithCustomDeleter() Q_DECL_EQ_DELETE; - ~ExternalRefCountWithCustomDeleter() Q_DECL_EQ_DELETE; + ExternalRefCountWithCustomDeleter() = delete; + ~ExternalRefCountWithCustomDeleter() = delete; Q_DISABLE_COPY(ExternalRefCountWithCustomDeleter) }; @@ -280,8 +280,8 @@ namespace QtSharedPointer { private: // prevent construction - ExternalRefCountWithContiguousData() Q_DECL_EQ_DELETE; - ~ExternalRefCountWithContiguousData() Q_DECL_EQ_DELETE; + ExternalRefCountWithContiguousData() = delete; + ~ExternalRefCountWithContiguousData() = delete; Q_DISABLE_COPY(ExternalRefCountWithContiguousData) }; @@ -705,11 +705,7 @@ template class QEnableSharedFromThis { protected: -#ifdef Q_COMPILER_DEFAULT_MEMBERS QEnableSharedFromThis() = default; -#else - Q_DECL_CONSTEXPR QEnableSharedFromThis() {} -#endif QEnableSharedFromThis(const QEnableSharedFromThis &) {} QEnableSharedFromThis &operator=(const QEnableSharedFromThis &) { return *this; } diff --git a/src/corelib/tools/qstringbuilder.h b/src/corelib/tools/qstringbuilder.h index 79ed10c7a8..b3cf2f695e 100644 --- a/src/corelib/tools/qstringbuilder.h +++ b/src/corelib/tools/qstringbuilder.h @@ -150,7 +150,7 @@ class QStringBuilder : public QStringBuilderBase @@ -167,7 +167,7 @@ class QStringBuilder : public QStringBuilderBase Date: Tue, 30 Apr 2019 12:51:36 +0200 Subject: Prefix textstream operators with Qt:: As the non prefixed variants are deprecated Change-Id: I2ba09d71b9cea5203b54297a3f2332e6d44fedcf Reviewed-by: Allan Sandfeld Jensen --- src/corelib/tools/qstring.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index 029499039c..93d81b89b6 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -826,9 +826,9 @@ static int ucstricmp(const QChar *a, const QChar *ae, const QChar *b, const QCha uint alast = 0; uint blast = 0; while (a < e) { -// qDebug() << hex << alast << blast; -// qDebug() << hex << "*a=" << *a << "alast=" << alast << "folded=" << foldCase (*a, alast); -// qDebug() << hex << "*b=" << *b << "blast=" << blast << "folded=" << foldCase (*b, blast); +// qDebug() << Qt::hex << alast << blast; +// qDebug() << Qt::hex << "*a=" << *a << "alast=" << alast << "folded=" << foldCase (*a, alast); +// qDebug() << Qt::hex << "*b=" << *b << "blast=" << blast << "folded=" << foldCase (*b, blast); int diff = foldCase(a->unicode(), alast) - foldCase(b->unicode(), blast); if ((diff)) return diff; -- cgit v1.2.3 From 936632c9c1e92de899bb17596a66167e8d515bc4 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Thu, 2 May 2019 11:46:32 +0200 Subject: QList: fix regression in swapItemsAt Commit e0d2b50249839d10ecf87abc296b8020046d1d75 makes swapItemsAt use ADL to find swap(). Problem is, QList has a swap() function (that swaps the elements at the specificed _indices_); that function will be found before ADL kicks in. So do the second best thing: use qSwap instead. Change-Id: Icf2b4e3ce09117e4056acbad3e2d8a625861d807 Reviewed-by: Lars Knoll --- src/corelib/tools/qlist.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index 59578b1e61..b916dcfd24 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -707,8 +707,7 @@ inline void QList::swapItemsAt(int i, int j) Q_ASSERT_X(i >= 0 && i < p.size() && j >= 0 && j < p.size(), "QList::swap", "index out of range"); detach(); - using std::swap; - swap(d->array[d->begin + i], d->array[d->begin + j]); + qSwap(d->array[d->begin + i], d->array[d->begin + j]); } template -- cgit v1.2.3 From 1b16f79bf2a4efa5c8f60ae48adbf563fa819611 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Thu, 2 May 2019 18:14:20 +0200 Subject: QSharedData: delete the copy assignment operator Do not merely declare it as private, use C++11's = delete. This has the nice side effect that subclasses are no longer implicitly copy assignable either (they shouldn't be). Change-Id: Icd03f71006c31baf7d079365fa3bea1a2a9d559b Reviewed-by: Thiago Macieira --- src/corelib/tools/qshareddata.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qshareddata.h b/src/corelib/tools/qshareddata.h index 04051472d6..c29a509209 100644 --- a/src/corelib/tools/qshareddata.h +++ b/src/corelib/tools/qshareddata.h @@ -60,9 +60,8 @@ public: inline QSharedData() : ref(0) { } inline QSharedData(const QSharedData &) : ref(0) { } -private: // using the assignment operator would lead to corruption in the ref-counting - QSharedData &operator=(const QSharedData &); + QSharedData &operator=(const QSharedData &) = delete; }; template class QSharedDataPointer -- cgit v1.2.3 From d775b1fcb3fc7bd41af37f5d0a4d999320b62364 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Thu, 4 Apr 2019 18:13:32 +0200 Subject: Remove handling of missing Q_COMPILER_INITIALIZER_LISTS Change-Id: Id65b39c787235a051262544932e6717d076f1ea0 Reviewed-by: Edward Welbourne Reviewed-by: Thiago Macieira --- src/corelib/tools/qhash.h | 9 +-------- src/corelib/tools/qlinkedlist.h | 10 ++-------- src/corelib/tools/qlist.h | 9 ++------- src/corelib/tools/qmap.h | 11 ++--------- src/corelib/tools/qset.h | 5 ----- src/corelib/tools/qstringlist.h | 2 -- src/corelib/tools/qvarlengtharray.h | 12 +++--------- src/corelib/tools/qvector.h | 16 +++++----------- src/corelib/tools/qversionnumber.h | 4 ---- 9 files changed, 15 insertions(+), 63 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h index 0078bbbee9..4b4cb2d5f0 100644 --- a/src/corelib/tools/qhash.h +++ b/src/corelib/tools/qhash.h @@ -48,11 +48,8 @@ #include #include -#ifdef Q_COMPILER_INITIALIZER_LISTS -#include -#endif - #include +#include #if defined(Q_CC_MSVC) #pragma warning( push ) @@ -242,7 +239,6 @@ class QHash public: inline QHash() noexcept : d(const_cast(&QHashData::shared_null)) { } -#ifdef Q_COMPILER_INITIALIZER_LISTS inline QHash(std::initializer_list > list) : d(const_cast(&QHashData::shared_null)) { @@ -250,7 +246,6 @@ public: for (typename std::initializer_list >::const_iterator it = list.begin(); it != list.end(); ++it) insert(it->first, it->second); } -#endif QHash(const QHash &other) : d(other.d) { d->ref.ref(); if (!d->sharable) detach(); } ~QHash() { if (!d->ref.deref()) freeData(d); } @@ -1042,14 +1037,12 @@ class QMultiHash : public QHash { public: QMultiHash() noexcept {} -#ifdef Q_COMPILER_INITIALIZER_LISTS inline QMultiHash(std::initializer_list > list) { this->reserve(int(list.size())); for (typename std::initializer_list >::const_iterator it = list.begin(); it != list.end(); ++it) insert(it->first, it->second); } -#endif #ifdef Q_QDOC template QMultiHash(InputIterator f, InputIterator l); diff --git a/src/corelib/tools/qlinkedlist.h b/src/corelib/tools/qlinkedlist.h index 0c8a99e258..8994449fbf 100644 --- a/src/corelib/tools/qlinkedlist.h +++ b/src/corelib/tools/qlinkedlist.h @@ -44,15 +44,11 @@ #include #include +#include +#include #include #include -#include - -#if defined(Q_COMPILER_INITIALIZER_LISTS) -# include -#endif - QT_BEGIN_NAMESPACE @@ -83,10 +79,8 @@ class QLinkedList public: inline QLinkedList() noexcept : d(const_cast(&QLinkedListData::shared_null)) { } inline QLinkedList(const QLinkedList &l) : d(l.d) { d->ref.ref(); if (!d->sharable) detach(); } -#if defined(Q_COMPILER_INITIALIZER_LISTS) inline QLinkedList(std::initializer_list list) : QLinkedList(list.begin(), list.end()) {} -#endif template = true> inline QLinkedList(InputIterator first, InputIterator last) : QLinkedList() diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index b916dcfd24..27868f7313 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -48,12 +48,10 @@ #include #include -#include -#include #include -#ifdef Q_COMPILER_INITIALIZER_LISTS #include -#endif +#include +#include #include #include @@ -166,13 +164,10 @@ public: inline QList &operator=(QList &&other) noexcept { QList moved(std::move(other)); swap(moved); return *this; } inline void swap(QList &other) noexcept { qSwap(d, other.d); } -#ifdef Q_COMPILER_INITIALIZER_LISTS inline QList(std::initializer_list args) : QList(args.begin(), args.end()) {} -#endif template = true> QList(InputIterator first, InputIterator last); - bool operator==(const QList &l) const; inline bool operator!=(const QList &l) const { return !(*this == l); } diff --git a/src/corelib/tools/qmap.h b/src/corelib/tools/qmap.h index 2d01a75a42..18c681581f 100644 --- a/src/corelib/tools/qmap.h +++ b/src/corelib/tools/qmap.h @@ -49,13 +49,10 @@ #include #endif -#include -#include #include - -#ifdef Q_COMPILER_INITIALIZER_LISTS #include -#endif +#include +#include QT_BEGIN_NAMESPACE @@ -326,14 +323,12 @@ class QMap public: inline QMap() noexcept : d(static_cast *>(const_cast(&QMapDataBase::shared_null))) { } -#ifdef Q_COMPILER_INITIALIZER_LISTS inline QMap(std::initializer_list > list) : d(static_cast *>(const_cast(&QMapDataBase::shared_null))) { for (typename std::initializer_list >::const_iterator it = list.begin(); it != list.end(); ++it) insert(it->first, it->second); } -#endif QMap(const QMap &other); inline ~QMap() { if (!d->ref.deref()) d->destroy(); } @@ -1186,13 +1181,11 @@ class QMultiMap : public QMap { public: QMultiMap() noexcept {} -#ifdef Q_COMPILER_INITIALIZER_LISTS inline QMultiMap(std::initializer_list > list) { for (typename std::initializer_list >::const_iterator it = list.begin(); it != list.end(); ++it) insert(it->first, it->second); } -#endif QMultiMap(const QMap &other) : QMap(other) {} QMultiMap(QMap &&other) noexcept : QMap(std::move(other)) {} void swap(QMultiMap &other) noexcept { QMap::swap(other); } diff --git a/src/corelib/tools/qset.h b/src/corelib/tools/qset.h index 7ae715d247..8b31de71a9 100644 --- a/src/corelib/tools/qset.h +++ b/src/corelib/tools/qset.h @@ -43,10 +43,7 @@ #include #include -#ifdef Q_COMPILER_INITIALIZER_LISTS #include -#endif - #include QT_BEGIN_NAMESPACE @@ -59,10 +56,8 @@ class QSet public: inline QSet() noexcept {} -#ifdef Q_COMPILER_INITIALIZER_LISTS inline QSet(std::initializer_list list) : QSet(list.begin(), list.end()) {} -#endif template = true> inline QSet(InputIterator first, InputIterator last) { diff --git a/src/corelib/tools/qstringlist.h b/src/corelib/tools/qstringlist.h index 73ac737643..cf136a64c6 100644 --- a/src/corelib/tools/qstringlist.h +++ b/src/corelib/tools/qstringlist.h @@ -105,9 +105,7 @@ public: inline explicit QStringList(const QString &i) { append(i); } inline QStringList(const QList &l) : QList(l) { } inline QStringList(QList &&l) noexcept : QList(std::move(l)) { } -#ifdef Q_COMPILER_INITIALIZER_LISTS inline QStringList(std::initializer_list args) : QList(args) { } -#endif template = true> inline QStringList(InputIterator first, InputIterator last) : QList(first, last) { } diff --git a/src/corelib/tools/qvarlengtharray.h b/src/corelib/tools/qvarlengtharray.h index c81af68593..01fc63b677 100644 --- a/src/corelib/tools/qvarlengtharray.h +++ b/src/corelib/tools/qvarlengtharray.h @@ -45,14 +45,12 @@ #include #include -#include -#include -#include #include -#ifdef Q_COMPILER_INITIALIZER_LISTS #include -#endif #include +#include +#include +#include QT_BEGIN_NAMESPACE @@ -70,12 +68,10 @@ public: append(other.constData(), other.size()); } -#ifdef Q_COMPILER_INITIALIZER_LISTS QVarLengthArray(std::initializer_list args) : QVarLengthArray(args.begin(), args.end()) { } -#endif template = true> inline QVarLengthArray(InputIterator first, InputIterator last) @@ -103,7 +99,6 @@ public: return *this; } -#ifdef Q_COMPILER_INITIALIZER_LISTS QVarLengthArray &operator=(std::initializer_list list) { resize(list.size()); @@ -111,7 +106,6 @@ public: QT_MAKE_CHECKED_ARRAY_ITERATOR(this->begin(), this->size())); return *this; } -#endif inline void removeLast() { Q_ASSERT(s > 0); diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h index 7e14a0c9b2..d6baa76a30 100644 --- a/src/corelib/tools/qvector.h +++ b/src/corelib/tools/qvector.h @@ -48,12 +48,10 @@ #include #include +#include #include #include #include -#ifdef Q_COMPILER_INITIALIZER_LISTS -#include -#endif #include @@ -76,10 +74,8 @@ public: QVector &operator=(QVector &&other) noexcept { QVector moved(std::move(other)); swap(moved); return *this; } void swap(QVector &other) noexcept { qSwap(d, other.d); } -#ifdef Q_COMPILER_INITIALIZER_LISTS inline QVector(std::initializer_list args); QVector &operator=(std::initializer_list args); -#endif template = true> inline QVector(InputIterator first, InputIterator last); @@ -521,11 +517,10 @@ QVector::QVector(int asize, const T &t) } } -#ifdef Q_COMPILER_INITIALIZER_LISTS -# if defined(Q_CC_MSVC) +#if defined(Q_CC_MSVC) QT_WARNING_PUSH QT_WARNING_DISABLE_MSVC(4127) // conditional expression is constant -# endif // Q_CC_MSVC +#endif // Q_CC_MSVC template QVector::QVector(std::initializer_list args) @@ -550,10 +545,9 @@ QVector &QVector::operator=(std::initializer_list args) return *this; } -# if defined(Q_CC_MSVC) +#if defined(Q_CC_MSVC) QT_WARNING_POP -# endif // Q_CC_MSVC -#endif // Q_COMPILER_INITIALIZER_LISTS +#endif // Q_CC_MSVC template template > diff --git a/src/corelib/tools/qversionnumber.h b/src/corelib/tools/qversionnumber.h index 1488014d38..d43b86ba51 100644 --- a/src/corelib/tools/qversionnumber.h +++ b/src/corelib/tools/qversionnumber.h @@ -138,7 +138,6 @@ class QVersionNumber else pointer_segments = new QVector(std::move(seg)); } -#ifdef Q_COMPILER_INITIALIZER_LISTS SegmentStorage(std::initializer_list args) { if (dataFitsInline(args.begin(), int(args.size()))) { @@ -147,7 +146,6 @@ class QVersionNumber pointer_segments = new QVector(args); } } -#endif ~SegmentStorage() { if (isUsingPointer()) delete pointer_segments; } @@ -229,11 +227,9 @@ public: : m_segments(std::move(seg)) {} -#ifdef Q_COMPILER_INITIALIZER_LISTS inline QVersionNumber(std::initializer_list args) : m_segments(args) {} -#endif inline explicit QVersionNumber(int maj) { m_segments.setSegments(1, maj); } -- cgit v1.2.3 From 82ddecfb17158c35de1d0740dd7ecd5562d41726 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 3 May 2019 11:53:18 +0200 Subject: Deprecate {to,from}Std{List,Vector} ask our users to use the range constructors instead. This will allow us to remove the include dependency towards and in Qt 6. Change-Id: Id90f2058432e19941de1fa847100a7920432ad71 Reviewed-by: Thiago Macieira --- src/corelib/tools/qlist.h | 6 ++++++ src/corelib/tools/qvector.h | 6 ++++++ 2 files changed, 12 insertions(+) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index 27868f7313..513d7eafe1 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -51,7 +51,9 @@ #include #include #include +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) #include +#endif #include #include @@ -403,10 +405,14 @@ public: static QList fromVector(const QVector &vector); static QList fromSet(const QSet &set); +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) + Q_DECL_DEPRECATED_X("Use QList(list.begin(), list.end()) instead.") static inline QList fromStdList(const std::list &list) { QList tmp; std::copy(list.begin(), list.end(), std::back_inserter(tmp)); return tmp; } + Q_DECL_DEPRECATED_X("Use std::list(list.begin(), list.end()) instead.") inline std::list toStdList() const { std::list tmp; std::copy(constBegin(), constEnd(), std::back_inserter(tmp)); return tmp; } +#endif private: Node *detach_helper_grow(int i, int n); diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h index d6baa76a30..4e148c9c55 100644 --- a/src/corelib/tools/qvector.h +++ b/src/corelib/tools/qvector.h @@ -49,7 +49,9 @@ #include #include +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) #include +#endif #include #include @@ -292,10 +294,14 @@ public: static QVector fromList(const QList &list); +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) + Q_DECL_DEPRECATED_X("Use QVector(vector.begin(), vector.end()) instead.") static inline QVector fromStdVector(const std::vector &vector) { QVector tmp; tmp.reserve(int(vector.size())); std::copy(vector.begin(), vector.end(), std::back_inserter(tmp)); return tmp; } + Q_DECL_DEPRECATED_X("Use std::vector(vector.begin(), vector.end()) instead.") inline std::vector toStdVector() const { return std::vector(d->begin(), d->end()); } +#endif private: // ### Qt6: remove methods, they are unused void reallocData(const int size, const int alloc, QArrayData::AllocationOptions options = QArrayData::Default); -- cgit v1.2.3 From aea6ff4f57135b0f2f076e86e22cb87c0a7014fe Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Tue, 7 May 2019 01:35:04 +0200 Subject: Fix the generation of docs for qobject_pointer_cast QSharedPointer uses a dummy header for qdoc; the functions were implemented and documented as qdoc comments, but not added to the dummy header. Change-Id: Iec78e3566a528631557067fbeb5606916ea74f2d Reviewed-by: Martin Smith --- src/corelib/tools/qsharedpointer.h | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qsharedpointer.h b/src/corelib/tools/qsharedpointer.h index 98b38b97d3..80d0618402 100644 --- a/src/corelib/tools/qsharedpointer.h +++ b/src/corelib/tools/qsharedpointer.h @@ -48,6 +48,8 @@ # include #else +#include // for std::shared_ptr + QT_BEGIN_NAMESPACE @@ -167,6 +169,10 @@ template QSharedPointer qSharedPointerConstCast(const QSha template QSharedPointer qSharedPointerConstCast(const QWeakPointer &src); template QSharedPointer qSharedPointerObjectCast(const QSharedPointer &src); template QSharedPointer qSharedPointerObjectCast(const QWeakPointer &src); +template std::shared_ptr qobject_pointer_cast(const std::shared_ptr &src); +template std::shared_ptr qobject_pointer_cast(std::shared_ptr &&src); +template std::shared_ptr qSharedPointerObjectCast(const std::shared_ptr &src); +template std::shared_ptr qSharedPointerObjectCast(std::shared_ptr &&src); template QWeakPointer qWeakPointerCast(const QWeakPointer &src); -- cgit v1.2.3 From d510e1e7f919e01a3b875ff5a575b818e5ee03e8 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Wed, 10 Oct 2018 08:51:04 +0200 Subject: Add swapItemsAt() to QVector This closes one compatibility gap with QList, to make it easier to replace QList with QVector in Qt6. Change-Id: I5655bc4cd2150a6f09a1ed68c0742f3b42ca47e4 Reviewed-by: Simon Hausmann --- src/corelib/tools/qvector.h | 7 +++++++ src/corelib/tools/qvector.qdoc | 10 ++++++++++ 2 files changed, 17 insertions(+) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h index 4e148c9c55..b763d6e7e2 100644 --- a/src/corelib/tools/qvector.h +++ b/src/corelib/tools/qvector.h @@ -251,6 +251,13 @@ public: T value(int i) const; T value(int i, const T &defaultValue) const; + void swapItemsAt(int i, int j) { + Q_ASSERT_X(i >= 0 && i < size() && j >= 0 && j < size(), + "QVector::swap", "index out of range"); + detach(); + qSwap(d->begin()[i], d->begin()[j]); + } + // STL compatibility typedef T value_type; typedef value_type* pointer; diff --git a/src/corelib/tools/qvector.qdoc b/src/corelib/tools/qvector.qdoc index cb47d36356..c1b5054f93 100644 --- a/src/corelib/tools/qvector.qdoc +++ b/src/corelib/tools/qvector.qdoc @@ -288,6 +288,16 @@ never fails. */ +/*! \fn template void QVector::swapItemsAt(int i, int j) + \since 5.14 + + Exchange the item at index position \a i with the item at index + position \a j. This function assumes that both \a i and \a j are + at least 0 but less than size(). To avoid failure, test that both + \a i and \a j are at least 0 and less than size(). +*/ + + /*! \fn template bool QVector::operator==(const QVector &other) const Returns \c true if \a other is equal to this vector; otherwise -- cgit v1.2.3 From 92f984273262531f909ede17a324f546fe502b5c Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 6 May 2019 14:00:53 +0200 Subject: Deprecate conversion functions between QList and QSet Users should use range constructors instead to do the conversion. Keep conversion methods between QList and QVector as these will turn into a no-op in Qt 6, whereas forcing people to use range constructors would lead to deep copies of the data. Change-Id: Id9fc9e4d007044e019826da523e8418857c91283 Reviewed-by: Simon Hausmann --- src/corelib/tools/qlist.h | 8 +++++--- src/corelib/tools/qset.h | 13 +++++++++---- src/corelib/tools/qvector.h | 3 +-- 3 files changed, 15 insertions(+), 9 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index 25380d45ec..04c1f12f5f 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -403,13 +403,15 @@ public: inline QList &operator<<(const QList &l) { *this += l; return *this; } + static QList fromVector(const QVector &vector); QVector toVector() const; - QSet toSet() const; - static QList fromVector(const QVector &vector); +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) + Q_DECL_DEPRECATED_X("Use QList(set.begin(), set.end()) instead.") static QList fromSet(const QSet &set); + Q_DECL_DEPRECATED_X("Use QSet(list.begin(), list.end()) instead.") + QSet toSet() const; -#if QT_VERSION < QT_VERSION_CHECK(6,0,0) Q_DECL_DEPRECATED_X("Use QList(list.begin(), list.end()) instead.") static inline QList fromStdList(const std::list &list) { QList tmp; std::copy(list.begin(), list.end(), std::back_inserter(tmp)); return tmp; } diff --git a/src/corelib/tools/qset.h b/src/corelib/tools/qset.h index 8b31de71a9..83e574bf1c 100644 --- a/src/corelib/tools/qset.h +++ b/src/corelib/tools/qset.h @@ -245,10 +245,13 @@ public: inline QSet operator-(const QSet &other) const { QSet result = *this; result -= other; return result; } - QList toList() const; - inline QList values() const { return toList(); } - + QList values() const; +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) + Q_DECL_DEPRECATED_X("Use values() instead.") + QList toList() const { return values(); } + Q_DECL_DEPRECATED_X("Use QSet(list.begin(), list.end()) instead.") static QSet fromList(const QList &list); +#endif private: Hash q_hash; @@ -368,7 +371,7 @@ Q_INLINE_TEMPLATE bool QSet::contains(const QSet &other) const } template -Q_OUTOFLINE_TEMPLATE QList QSet::toList() const +Q_OUTOFLINE_TEMPLATE QList QSet::values() const { QList result; result.reserve(size()); @@ -380,6 +383,7 @@ Q_OUTOFLINE_TEMPLATE QList QSet::toList() const return result; } +#if QT_VERSION < QT_VERSION_CHECK(6,0,0) template Q_OUTOFLINE_TEMPLATE QSet QList::toSet() const { @@ -401,6 +405,7 @@ QList QList::fromSet(const QSet &set) { return set.toList(); } +#endif Q_DECLARE_SEQUENTIAL_ITERATOR(Set) diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h index b763d6e7e2..492afeac75 100644 --- a/src/corelib/tools/qvector.h +++ b/src/corelib/tools/qvector.h @@ -297,9 +297,8 @@ public: inline QVector &operator<<(T &&t) { append(std::move(t)); return *this; } - QList toList() const; - static QVector fromList(const QList &list); + QList toList() const; #if QT_VERSION < QT_VERSION_CHECK(6,0,0) Q_DECL_DEPRECATED_X("Use QVector(vector.begin(), vector.end()) instead.") -- cgit v1.2.3 From 1dde5a7b9523ab7f62a6965edfd7b87ed40eecb8 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Wed, 13 Mar 2019 09:46:20 +0100 Subject: Remove deprecated QEasingCurve::cubicBezierSpline() function It has been deprecated since Qt 5.0 so hopefully nobody is using it anymore. Change-Id: If3466f8a2d25ea87cd51ca71606d2a27a428efcf Reviewed-by: Christian Ehrlicher --- src/corelib/tools/qeasingcurve.cpp | 5 ----- src/corelib/tools/qeasingcurve.h | 7 ------- 2 files changed, 12 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qeasingcurve.cpp b/src/corelib/tools/qeasingcurve.cpp index 9169b5c7f1..c807bbd2e1 100644 --- a/src/corelib/tools/qeasingcurve.cpp +++ b/src/corelib/tools/qeasingcurve.cpp @@ -1365,11 +1365,6 @@ void QEasingCurve::addTCBSegment(const QPointF &nextPoint, qreal t, qreal c, qre } -/*! - \fn QList QEasingCurve::cubicBezierSpline() const - \obsolete Use toCubicSpline() instead. - */ - /*! \since 5.0 diff --git a/src/corelib/tools/qeasingcurve.h b/src/corelib/tools/qeasingcurve.h index 725ddd5dcc..f7a1d6bdc0 100644 --- a/src/corelib/tools/qeasingcurve.h +++ b/src/corelib/tools/qeasingcurve.h @@ -43,10 +43,6 @@ #include #include #include -#if QT_DEPRECATED_SINCE(5, 0) -# include -# include -#endif QT_BEGIN_NAMESPACE @@ -102,9 +98,6 @@ public: void addCubicBezierSegment(const QPointF & c1, const QPointF & c2, const QPointF & endPoint); void addTCBSegment(const QPointF &nextPoint, qreal t, qreal c, qreal b); QVector toCubicSpline() const; -#if QT_DEPRECATED_SINCE(5, 0) - QT_DEPRECATED QList cubicBezierSpline() const { return toCubicSpline().toList(); } -#endif Type type() const; void setType(Type type); -- cgit v1.2.3 From 548513a4bd050d3df0a85fed6e2d1a00ce06d2ab Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Mon, 27 May 2019 17:47:22 +0200 Subject: Separate out the time, zone, date code from corelib/tools/ We'll be adding calendar code here as well, and tools/ was getting rather crowded, so it looks like time to move out a reasonably coherent sub-bundle of it all. Change-Id: I7e8030f38c31aa307f519dd918a43fc44baa6aa1 Reviewed-by: Lars Knoll --- src/corelib/tools/qdatetime.cpp | 5685 ------------------------ src/corelib/tools/qdatetime.h | 426 -- src/corelib/tools/qdatetime_p.h | 151 - src/corelib/tools/qdatetimeparser.cpp | 2047 --------- src/corelib/tools/qdatetimeparser_p.h | 310 -- src/corelib/tools/qlocale.cpp | 2 +- src/corelib/tools/qtimezone.cpp | 997 ----- src/corelib/tools/qtimezone.h | 188 - src/corelib/tools/qtimezoneprivate.cpp | 926 ---- src/corelib/tools/qtimezoneprivate_android.cpp | 257 -- src/corelib/tools/qtimezoneprivate_data_p.h | 1257 ------ src/corelib/tools/qtimezoneprivate_icu.cpp | 508 --- src/corelib/tools/qtimezoneprivate_mac.mm | 333 -- src/corelib/tools/qtimezoneprivate_p.h | 493 -- src/corelib/tools/qtimezoneprivate_tz.cpp | 1155 ----- src/corelib/tools/qtimezoneprivate_win.cpp | 927 ---- src/corelib/tools/tools.pri | 30 - 17 files changed, 1 insertion(+), 15691 deletions(-) delete mode 100644 src/corelib/tools/qdatetime.cpp delete mode 100644 src/corelib/tools/qdatetime.h delete mode 100644 src/corelib/tools/qdatetime_p.h delete mode 100644 src/corelib/tools/qdatetimeparser.cpp delete mode 100644 src/corelib/tools/qdatetimeparser_p.h delete mode 100644 src/corelib/tools/qtimezone.cpp delete mode 100644 src/corelib/tools/qtimezone.h delete mode 100644 src/corelib/tools/qtimezoneprivate.cpp delete mode 100644 src/corelib/tools/qtimezoneprivate_android.cpp delete mode 100644 src/corelib/tools/qtimezoneprivate_data_p.h delete mode 100644 src/corelib/tools/qtimezoneprivate_icu.cpp delete mode 100644 src/corelib/tools/qtimezoneprivate_mac.mm delete mode 100644 src/corelib/tools/qtimezoneprivate_p.h delete mode 100644 src/corelib/tools/qtimezoneprivate_tz.cpp delete mode 100644 src/corelib/tools/qtimezoneprivate_win.cpp (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp deleted file mode 100644 index 9220d210f1..0000000000 --- a/src/corelib/tools/qdatetime.cpp +++ /dev/null @@ -1,5685 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2019 The Qt Company Ltd. -** Copyright (C) 2016 Intel Corporation. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qplatformdefs.h" -#include "private/qdatetime_p.h" -#if QT_CONFIG(datetimeparser) -#include "private/qdatetimeparser_p.h" -#endif - -#include "qdatastream.h" -#include "qset.h" -#include "qlocale.h" -#include "qdatetime.h" -#if QT_CONFIG(timezone) -#include "qtimezoneprivate_p.h" -#endif -#include "qregexp.h" -#include "qdebug.h" -#ifndef Q_OS_WIN -#include -#endif - -#include -#ifdef Q_CC_MINGW -# include // Define _POSIX_THREAD_SAFE_FUNCTIONS to obtain localtime_r() -#endif -#include -#ifdef Q_OS_WIN -# include -# ifdef Q_OS_WINRT -# include "qfunctions_winrt.h" -# endif -#endif - -#if defined(Q_OS_MAC) -#include -#endif - -QT_BEGIN_NAMESPACE - -/***************************************************************************** - Date/Time Constants - *****************************************************************************/ - -enum { - SECS_PER_DAY = 86400, - MSECS_PER_DAY = 86400000, - SECS_PER_HOUR = 3600, - MSECS_PER_HOUR = 3600000, - SECS_PER_MIN = 60, - MSECS_PER_MIN = 60000, - TIME_T_MAX = 2145916799, // int maximum 2037-12-31T23:59:59 UTC - JULIAN_DAY_FOR_EPOCH = 2440588 // result of julianDayFromDate(1970, 1, 1) -}; - -/***************************************************************************** - QDate static helper functions - *****************************************************************************/ - -static inline QDate fixedDate(int y, int m, int d) -{ - QDate result(y, m, 1); - result.setDate(y, m, qMin(d, result.daysInMonth())); - return result; -} - -/* - Division, rounding down (rather than towards zero). - - From C++11 onwards, integer division is defined to round towards zero, so we - can rely on that when implementing this. This is only used with denominator b - > 0, so we only have to treat negative numerator, a, specially. - */ -static inline qint64 floordiv(qint64 a, int b) -{ - return (a - (a < 0 ? b - 1 : 0)) / b; -} - -static inline int floordiv(int a, int b) -{ - return (a - (a < 0 ? b - 1 : 0)) / b; -} - -static inline qint64 julianDayFromDate(int year, int month, int day) -{ - // Adjust for no year 0 - if (year < 0) - ++year; - -/* - * Math from The Calendar FAQ at http://www.tondering.dk/claus/cal/julperiod.php - * This formula is correct for all julian days, when using mathematical integer - * division (round to negative infinity), not c++11 integer division (round to zero) - */ - int a = floordiv(14 - month, 12); - qint64 y = (qint64)year + 4800 - a; - int m = month + 12 * a - 3; - return day + floordiv(153 * m + 2, 5) + 365 * y + floordiv(y, 4) - floordiv(y, 100) + floordiv(y, 400) - 32045; -} - -struct ParsedDate -{ - int year, month, day; -}; - -// prevent this function from being inlined into all 10 users -Q_NEVER_INLINE -static ParsedDate getDateFromJulianDay(qint64 julianDay) -{ -/* - * Math from The Calendar FAQ at http://www.tondering.dk/claus/cal/julperiod.php - * This formula is correct for all julian days, when using mathematical integer - * division (round to negative infinity), not c++11 integer division (round to zero) - */ - qint64 a = julianDay + 32044; - qint64 b = floordiv(4 * a + 3, 146097); - int c = a - floordiv(146097 * b, 4); - - int d = floordiv(4 * c + 3, 1461); - int e = c - floordiv(1461 * d, 4); - int m = floordiv(5 * e + 2, 153); - - int day = e - floordiv(153 * m + 2, 5) + 1; - int month = m + 3 - 12 * floordiv(m, 10); - int year = 100 * b + d - 4800 + floordiv(m, 10); - - // Adjust for no year 0 - if (year <= 0) - --year ; - - return { year, month, day }; -} - -/***************************************************************************** - Date/Time formatting helper functions - *****************************************************************************/ - -#if QT_CONFIG(textdate) -static const char qt_shortMonthNames[][4] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" -}; - -static int qt_monthNumberFromShortName(QStringRef shortName) -{ - for (unsigned int i = 0; i < sizeof(qt_shortMonthNames) / sizeof(qt_shortMonthNames[0]); ++i) { - if (shortName == QLatin1String(qt_shortMonthNames[i], 3)) - return i + 1; - } - return -1; -} -static int qt_monthNumberFromShortName(const QString &shortName) -{ return qt_monthNumberFromShortName(QStringRef(&shortName)); } - -static int fromShortMonthName(const QStringRef &monthName) -{ - // Assume that English monthnames are the default - int month = qt_monthNumberFromShortName(monthName); - if (month != -1) - return month; - // If English names can't be found, search the localized ones - for (int i = 1; i <= 12; ++i) { - if (monthName == QLocale::system().monthName(i, QLocale::ShortFormat)) - return i; - } - return -1; -} -#endif // textdate - -#if QT_CONFIG(datestring) -struct ParsedRfcDateTime { - QDate date; - QTime time; - int utcOffset; -}; - -static ParsedRfcDateTime rfcDateImpl(const QString &s) -{ - ParsedRfcDateTime result; - - // Matches "Wdy, dd Mon yyyy HH:mm:ss ±hhmm" (Wdy, being optional) - QRegExp rex(QStringLiteral("^(?:[A-Z][a-z]+,)?[ \\t]*(\\d{1,2})[ \\t]+([A-Z][a-z]+)[ \\t]+(\\d\\d\\d\\d)(?:[ \\t]+(\\d\\d):(\\d\\d)(?::(\\d\\d))?)?[ \\t]*(?:([+-])(\\d\\d)(\\d\\d))?")); - if (s.indexOf(rex) == 0) { - const QStringList cap = rex.capturedTexts(); - result.date = QDate(cap[3].toInt(), qt_monthNumberFromShortName(cap[2]), cap[1].toInt()); - if (!cap[4].isEmpty()) - result.time = QTime(cap[4].toInt(), cap[5].toInt(), cap[6].toInt()); - const bool positiveOffset = (cap[7] == QLatin1String("+")); - const int hourOffset = cap[8].toInt(); - const int minOffset = cap[9].toInt(); - result.utcOffset = ((hourOffset * 60 + minOffset) * (positiveOffset ? 60 : -60)); - } else { - // Matches "Wdy Mon dd HH:mm:ss yyyy" - QRegExp rex(QStringLiteral("^[A-Z][a-z]+[ \\t]+([A-Z][a-z]+)[ \\t]+(\\d\\d)(?:[ \\t]+(\\d\\d):(\\d\\d):(\\d\\d))?[ \\t]+(\\d\\d\\d\\d)[ \\t]*(?:([+-])(\\d\\d)(\\d\\d))?")); - if (s.indexOf(rex) == 0) { - const QStringList cap = rex.capturedTexts(); - result.date = QDate(cap[6].toInt(), qt_monthNumberFromShortName(cap[1]), cap[2].toInt()); - if (!cap[3].isEmpty()) - result.time = QTime(cap[3].toInt(), cap[4].toInt(), cap[5].toInt()); - const bool positiveOffset = (cap[7] == QLatin1String("+")); - const int hourOffset = cap[8].toInt(); - const int minOffset = cap[9].toInt(); - result.utcOffset = ((hourOffset * 60 + minOffset) * (positiveOffset ? 60 : -60)); - } - } - - return result; -} -#endif // datestring - -// Return offset in [+-]HH:mm format -static QString toOffsetString(Qt::DateFormat format, int offset) -{ - return QString::asprintf("%c%02d%s%02d", - offset >= 0 ? '+' : '-', - qAbs(offset) / SECS_PER_HOUR, - // Qt::ISODate puts : between the hours and minutes, but Qt:TextDate does not: - format == Qt::TextDate ? "" : ":", - (qAbs(offset) / 60) % 60); -} - -#if QT_CONFIG(datestring) -// Parse offset in [+-]HH[[:]mm] format -static int fromOffsetString(const QStringRef &offsetString, bool *valid) noexcept -{ - *valid = false; - - const int size = offsetString.size(); - if (size < 2 || size > 6) - return 0; - - // sign will be +1 for a positive and -1 for a negative offset - int sign; - - // First char must be + or - - const QChar signChar = offsetString.at(0); - if (signChar == QLatin1Char('+')) - sign = 1; - else if (signChar == QLatin1Char('-')) - sign = -1; - else - return 0; - - // Split the hour and minute parts - const QStringRef time = offsetString.mid(1); - int hhLen = time.indexOf(QLatin1Char(':')); - int mmIndex; - if (hhLen == -1) - mmIndex = hhLen = 2; // [+-]HHmm or [+-]HH format - else - mmIndex = hhLen + 1; - - const QStringRef hhRef = time.left(hhLen); - bool ok = false; - const int hour = hhRef.toInt(&ok); - if (!ok) - return 0; - - const QStringRef mmRef = time.mid(mmIndex); - const int minute = mmRef.isEmpty() ? 0 : mmRef.toInt(&ok); - if (!ok || minute < 0 || minute > 59) - return 0; - - *valid = true; - return sign * ((hour * 60) + minute) * 60; -} -#endif // datestring - -static constexpr int daysInUsualMonth(int month) // (February isn't usual.) -{ - // Long if odd up to July = 7, or if even from 8 = August onwards: - return Q_ASSERT(month != 2 && month > 0 && month <= 12), 30 | ((month & 1) ^ (month >> 3)); -} - -/***************************************************************************** - QDate member functions - *****************************************************************************/ - -/*! - \since 4.5 - - \enum QDate::MonthNameType - - This enum describes the types of the string representation used - for the month name. - - \value DateFormat This type of name can be used for date-to-string formatting. - \value StandaloneFormat This type is used when you need to enumerate months or weekdays. - Usually standalone names are represented in singular forms with - capitalized first letter. -*/ - -/*! - \class QDate - \inmodule QtCore - \reentrant - \brief The QDate class provides date functions. - - - A QDate object encodes a calendar date, i.e. year, month, and day numbers, - in the proleptic Gregorian calendar by default. It can read the current date - from the system clock. It provides functions for comparing dates, and for - manipulating dates. For example, it is possible to add and subtract days, - months, and years to dates. - - A QDate object is typically created by giving the year, month, and day - numbers explicitly. Note that QDate interprets two digit years as presented, - i.e., as years 0 through 99, without adding any offset. A QDate can also be - constructed with the static function currentDate(), which creates a QDate - object containing the system clock's date. An explicit date can also be set - using setDate(). The fromString() function returns a QDate given a string - and a date format which is used to interpret the date within the string. - - The year(), month(), and day() functions provide access to the - year, month, and day numbers. Also, dayOfWeek() and dayOfYear() - functions are provided. The same information is provided in - textual format by the toString(), shortDayName(), longDayName(), - shortMonthName(), and longMonthName() functions. - - QDate provides a full set of operators to compare two QDate - objects where smaller means earlier, and larger means later. - - You can increment (or decrement) a date by a given number of days - using addDays(). Similarly you can use addMonths() and addYears(). - The daysTo() function returns the number of days between two - dates. - - The daysInMonth() and daysInYear() functions return how many days - there are in this date's month and year, respectively. The - isLeapYear() function indicates whether a date is in a leap year. - - \section1 Remarks - - \section2 No Year 0 - - There is no year 0. Dates in that year are considered invalid. The year -1 - is the year "1 before Christ" or "1 before current era." The day before 1 - January 1 CE, QDate(1, 1, 1), is 31 December 1 BCE, QDate(-1, 12, 31). - - \section2 Range of Valid Dates - - Dates are stored internally as a Julian Day number, an integer count of - every day in a contiguous range, with 24 November 4714 BCE in the Gregorian - calendar being Julian Day 0 (1 January 4713 BCE in the Julian calendar). - As well as being an efficient and accurate way of storing an absolute date, - it is suitable for converting a Date into other calendar systems such as - Hebrew, Islamic or Chinese. The Julian Day number can be obtained using - QDate::toJulianDay() and can be set using QDate::fromJulianDay(). - - The range of dates able to be stored by QDate as a Julian Day number is - for technical reasons limited to between -784350574879 and 784354017364, - which means from before 2 billion BCE to after 2 billion CE. - - \sa QTime, QDateTime, QDateEdit, QDateTimeEdit, QCalendarWidget -*/ - -/*! - \fn QDate::QDate() - - Constructs a null date. Null dates are invalid. - - \sa isNull(), isValid() -*/ - -/*! - Constructs a date with year \a y, month \a m and day \a d. - - If the specified date is invalid, the date is not set and - isValid() returns \c false. - - \warning Years 1 to 99 are interpreted as is. Year 0 is invalid. - - \sa isValid() -*/ - -QDate::QDate(int y, int m, int d) -{ - setDate(y, m, d); -} - - -/*! - \fn bool QDate::isNull() const - - Returns \c true if the date is null; otherwise returns \c false. A null - date is invalid. - - \note The behavior of this function is equivalent to isValid(). - - \sa isValid() -*/ - -/*! - \fn bool QDate::isValid() const - - Returns \c true if this date is valid; otherwise returns \c false. - - \sa isNull() -*/ - -/*! - Returns the year of this date. Negative numbers indicate years - before 1 CE, such that year -44 is 44 BCE. - - Returns 0 if the date is invalid. - - \sa month(), day() -*/ - -int QDate::year() const -{ - if (isNull()) - return 0; - - return getDateFromJulianDay(jd).year; -} - -/*! - Returns the number corresponding to the month of this date, using - the following convention: - - \list - \li 1 = "January" - \li 2 = "February" - \li 3 = "March" - \li 4 = "April" - \li 5 = "May" - \li 6 = "June" - \li 7 = "July" - \li 8 = "August" - \li 9 = "September" - \li 10 = "October" - \li 11 = "November" - \li 12 = "December" - \endlist - - Returns 0 if the date is invalid. - - \sa year(), day() -*/ - -int QDate::month() const -{ - if (isNull()) - return 0; - - return getDateFromJulianDay(jd).month; -} - -/*! - Returns the day of the month (1 to 31) of this date. - - Returns 0 if the date is invalid. - - \sa year(), month(), dayOfWeek() -*/ - -int QDate::day() const -{ - if (isNull()) - return 0; - - return getDateFromJulianDay(jd).day; -} - -/*! - Returns the weekday (1 = Monday to 7 = Sunday) for this date. - - Returns 0 if the date is invalid. - - \sa day(), dayOfYear(), Qt::DayOfWeek -*/ - -int QDate::dayOfWeek() const -{ - if (isNull()) - return 0; - - if (jd >= 0) - return (jd % 7) + 1; - else - return ((jd + 1) % 7) + 7; -} - -/*! - Returns the day of the year (1 to 365 or 366 on leap years) for - this date. - - Returns 0 if the date is invalid. - - \sa day(), dayOfWeek() -*/ - -int QDate::dayOfYear() const -{ - if (isNull()) - return 0; - - return jd - julianDayFromDate(year(), 1, 1) + 1; -} - -/*! - Returns the number of days in the month (28 to 31) for this date. - - Returns 0 if the date is invalid. - - \sa day(), daysInYear() -*/ - -int QDate::daysInMonth() const -{ - if (isNull()) - return 0; - - const ParsedDate pd = getDateFromJulianDay(jd); - if (pd.month == 2) - return isLeapYear(pd.year) ? 29 : 28; - - return daysInUsualMonth(pd.month); -} - -/*! - Returns the number of days in the year (365 or 366) for this date. - - Returns 0 if the date is invalid. - - \sa day(), daysInMonth() -*/ - -int QDate::daysInYear() const -{ - if (isNull()) - return 0; - - return isLeapYear(getDateFromJulianDay(jd).year) ? 366 : 365; -} - -/*! - Returns the week number (1 to 53), and stores the year in - *\a{yearNumber} unless \a yearNumber is null (the default). - - Returns 0 if the date is invalid. - - In accordance with ISO 8601, weeks start on Monday and the first - Thursday of a year is always in week 1 of that year. Most years - have 52 weeks, but some have 53. - - *\a{yearNumber} is not always the same as year(). For example, 1 - January 2000 has week number 52 in the year 1999, and 31 December - 2002 has week number 1 in the year 2003. - - \sa isValid() -*/ - -int QDate::weekNumber(int *yearNumber) const -{ - if (!isValid()) - return 0; - - int year = QDate::year(); - int yday = dayOfYear(); - int wday = dayOfWeek(); - - int week = (yday - wday + 10) / 7; - - if (week == 0) { - // last week of previous year - --year; - week = (yday + 365 + (QDate::isLeapYear(year) ? 1 : 0) - wday + 10) / 7; - Q_ASSERT(week == 52 || week == 53); - } else if (week == 53) { - // maybe first week of next year - int w = (yday - 365 - (QDate::isLeapYear(year) ? 1 : 0) - wday + 10) / 7; - if (w > 0) { - ++year; - week = w; - } - Q_ASSERT(week == 53 || week == 1); - } - - if (yearNumber != 0) - *yearNumber = year; - return week; -} - -static bool inDateTimeRange(qint64 jd, bool start) -{ - using Bounds = std::numeric_limits; - if (jd < Bounds::min() + JULIAN_DAY_FOR_EPOCH) - return false; - jd -= JULIAN_DAY_FOR_EPOCH; - const qint64 maxDay = Bounds::max() / MSECS_PER_DAY; - const qint64 minDay = Bounds::min() / MSECS_PER_DAY - 1; - // (Divisions rounded towards zero, as MSECS_PER_DAY has factors other than two.) - // Range includes start of last day and end of first: - if (start) - return jd > minDay && jd <= maxDay; - return jd >= minDay && jd < maxDay; -} - -static QDateTime toEarliest(const QDate &day, const QDateTime &form) -{ - const Qt::TimeSpec spec = form.timeSpec(); - const int offset = (spec == Qt::OffsetFromUTC) ? form.offsetFromUtc() : 0; -#if QT_CONFIG(timezone) - QTimeZone zone; - if (spec == Qt::TimeZone) - zone = form.timeZone(); -#endif - auto moment = [=](QTime time) { - switch (spec) { - case Qt::OffsetFromUTC: return QDateTime(day, time, spec, offset); -#if QT_CONFIG(timezone) - case Qt::TimeZone: return QDateTime(day, time, zone); -#endif - default: return QDateTime(day, time, spec); - } - }; - // Longest routine time-zone transition is 2 hours: - QDateTime when = moment(QTime(2, 0)); - if (!when.isValid()) { - // Noon should be safe ... - when = moment(QTime(12, 0)); - if (!when.isValid()) { - // ... unless it's a 24-hour jump (moving the date-line) - when = moment(QTime(23, 59, 59, 999)); - if (!when.isValid()) - return QDateTime(); - } - } - int high = when.time().msecsSinceStartOfDay() / 60000; - int low = 0; - // Binary chop to the right minute - while (high > low + 1) { - int mid = (high + low) / 2; - QDateTime probe = moment(QTime(mid / 60, mid % 60)); - if (probe.isValid() && probe.date() == day) { - high = mid; - when = probe; - } else { - low = mid; - } - } - return when; -} - -/*! - \since 5.14 - \fn QDateTime QDate::startOfDay(Qt::TimeSpec spec, int offsetSeconds) const - \fn QDateTime QDate::startOfDay(const QTimeZone &zone) const - - Returns the start-moment of the day. Usually, this shall be midnight at the - start of the day: however, if a time-zone transition causes the given date - to skip over that midnight (e.g. a DST spring-forward skipping from the end - of the previous day to 01:00 of the new day), the actual earliest time in - the day is returned. This can only arise when the start-moment is specified - in terms of a time-zone (by passing its QTimeZone as \a zone) or in terms of - local time (by passing Qt::LocalTime as \a spec; this is its default). - - The \a offsetSeconds is ignored unless \a spec is Qt::OffsetFromUTC, when it - gives the implied zone's offset from UTC. As UTC and such zones have no - transitions, the start of the day is QTime(0, 0) in these cases. - - In the rare case of a date that was entirely skipped (this happens when a - zone east of the international date-line switches to being west of it), the - return shall be invalid. Passing Qt::TimeZone as \a spec (instead of - passing a QTimeZone) or passing an invalid time-zone as \a zone will also - produce an invalid result, as shall dates that start outside the range - representable by QDateTime. - - \sa endOfDay() -*/ -QDateTime QDate::startOfDay(Qt::TimeSpec spec, int offsetSeconds) const -{ - if (!inDateTimeRange(jd, true)) - return QDateTime(); - - switch (spec) { - case Qt::TimeZone: // should pass a QTimeZone instead of Qt::TimeZone - qWarning() << "Called QDate::startOfDay(Qt::TimeZone) on" << *this; - return QDateTime(); - case Qt::OffsetFromUTC: - case Qt::UTC: - return QDateTime(*this, QTime(0, 0), spec, offsetSeconds); - - case Qt::LocalTime: - if (offsetSeconds) - qWarning("Ignoring offset (%d seconds) passed with Qt::LocalTime", offsetSeconds); - break; - } - QDateTime when(*this, QTime(0, 0), spec); - if (!when.isValid()) - when = toEarliest(*this, when); - - return when.isValid() ? when : QDateTime(); -} - -#if QT_CONFIG(timezone) -/*! - \overload - \since 5.14 -*/ -QDateTime QDate::startOfDay(const QTimeZone &zone) const -{ - if (!inDateTimeRange(jd, true) || !zone.isValid()) - return QDateTime(); - - QDateTime when(*this, QTime(0, 0), zone); - if (when.isValid()) - return when; - - // The start of the day must have fallen in a spring-forward's gap; find the spring-forward: - if (zone.hasTransitions()) { - QTimeZone::OffsetData tran = zone.previousTransition(QDateTime(*this, QTime(23, 59, 59, 999), zone)); - const QDateTime &at = tran.atUtc.toTimeZone(zone); - if (at.isValid() && at.date() == *this) - return at; - } - - when = toEarliest(*this, when); - return when.isValid() ? when : QDateTime(); -} -#endif // timezone - -static QDateTime toLatest(const QDate &day, const QDateTime &form) -{ - const Qt::TimeSpec spec = form.timeSpec(); - const int offset = (spec == Qt::OffsetFromUTC) ? form.offsetFromUtc() : 0; -#if QT_CONFIG(timezone) - QTimeZone zone; - if (spec == Qt::TimeZone) - zone = form.timeZone(); -#endif - auto moment = [=](QTime time) { - switch (spec) { - case Qt::OffsetFromUTC: return QDateTime(day, time, spec, offset); -#if QT_CONFIG(timezone) - case Qt::TimeZone: return QDateTime(day, time, zone); -#endif - default: return QDateTime(day, time, spec); - } - }; - // Longest routine time-zone transition is 2 hours: - QDateTime when = moment(QTime(21, 59, 59, 999)); - if (!when.isValid()) { - // Noon should be safe ... - when = moment(QTime(12, 0)); - if (!when.isValid()) { - // ... unless it's a 24-hour jump (moving the date-line) - when = moment(QTime(0, 0)); - if (!when.isValid()) - return QDateTime(); - } - } - int high = 24 * 60; - int low = when.time().msecsSinceStartOfDay() / 60000; - // Binary chop to the right minute - while (high > low + 1) { - int mid = (high + low) / 2; - QDateTime probe = moment(QTime(mid / 60, mid % 60, 59, 999)); - if (probe.isValid() && probe.date() == day) { - low = mid; - when = probe; - } else { - high = mid; - } - } - return when; -} - -/*! - \since 5.14 - \fn QDateTime QDate::endOfDay(Qt::TimeSpec spec, int offsetSeconds) const - \fn QDateTime QDate::endOfDay(const QTimeZone &zone) const - - Returns the end-moment of the day. Usually, this is one millisecond before - the midnight at the end of the day: however, if a time-zone transition - causes the given date to skip over that midnight (e.g. a DST spring-forward - skipping from just before 23:00 to the start of the next day), the actual - latest time in the day is returned. This can only arise when the - start-moment is specified in terms of a time-zone (by passing its QTimeZone - as \a zone) or in terms of local time (by passing Qt::LocalTime as \a spec; - this is its default). - - The \a offsetSeconds is ignored unless \a spec is Qt::OffsetFromUTC, when it - gives the implied zone's offset from UTC. As UTC and such zones have no - transitions, the end of the day is QTime(23, 59, 59, 999) in these cases. - - In the rare case of a date that was entirely skipped (this happens when a - zone east of the international date-line switches to being west of it), the - return shall be invalid. Passing Qt::TimeZone as \a spec (instead of - passing a QTimeZone) will also produce an invalid result, as shall dates - that end outside the range representable by QDateTime. - - \sa startOfDay() -*/ -QDateTime QDate::endOfDay(Qt::TimeSpec spec, int offsetSeconds) const -{ - if (!inDateTimeRange(jd, false)) - return QDateTime(); - - switch (spec) { - case Qt::TimeZone: // should pass a QTimeZone instead of Qt::TimeZone - qWarning() << "Called QDate::endOfDay(Qt::TimeZone) on" << *this; - return QDateTime(); - case Qt::UTC: - case Qt::OffsetFromUTC: - return QDateTime(*this, QTime(23, 59, 59, 999), spec, offsetSeconds); - - case Qt::LocalTime: - if (offsetSeconds) - qWarning("Ignoring offset (%d seconds) passed with Qt::LocalTime", offsetSeconds); - break; - } - QDateTime when(*this, QTime(23, 59, 59, 999), spec); - if (!when.isValid()) - when = toLatest(*this, when); - return when.isValid() ? when : QDateTime(); -} - -#if QT_CONFIG(timezone) -/*! - \overload - \since 5.14 -*/ -QDateTime QDate::endOfDay(const QTimeZone &zone) const -{ - if (!inDateTimeRange(jd, false) || !zone.isValid()) - return QDateTime(); - - QDateTime when(*this, QTime(23, 59, 59, 999), zone); - if (when.isValid()) - return when; - - // The end of the day must have fallen in a spring-forward's gap; find the spring-forward: - if (zone.hasTransitions()) { - QTimeZone::OffsetData tran = zone.nextTransition(QDateTime(*this, QTime(0, 0), zone)); - const QDateTime &at = tran.atUtc.toTimeZone(zone); - if (at.isValid() && at.date() == *this) - return at; - } - - when = toLatest(*this, when); - return when.isValid() ? when : QDateTime(); -} -#endif // timezone - -#if QT_DEPRECATED_SINCE(5, 11) && QT_CONFIG(textdate) - -/*! - \since 4.5 - \deprecated - - Returns the short name of the \a month for the representation specified - by \a type. - - The months are enumerated using the following convention: - - \list - \li 1 = "Jan" - \li 2 = "Feb" - \li 3 = "Mar" - \li 4 = "Apr" - \li 5 = "May" - \li 6 = "Jun" - \li 7 = "Jul" - \li 8 = "Aug" - \li 9 = "Sep" - \li 10 = "Oct" - \li 11 = "Nov" - \li 12 = "Dec" - \endlist - - The month names will be localized according to the system's - locale settings, i.e. using QLocale::system(). - - Returns an empty string if the date is invalid. - - \sa toString(), longMonthName(), shortDayName(), longDayName() -*/ - -QString QDate::shortMonthName(int month, QDate::MonthNameType type) -{ - switch (type) { - case QDate::DateFormat: - return QLocale::system().monthName(month, QLocale::ShortFormat); - case QDate::StandaloneFormat: - return QLocale::system().standaloneMonthName(month, QLocale::ShortFormat); - } - return QString(); -} - -/*! - \since 4.5 - \deprecated - - Returns the long name of the \a month for the representation specified - by \a type. - - The months are enumerated using the following convention: - - \list - \li 1 = "January" - \li 2 = "February" - \li 3 = "March" - \li 4 = "April" - \li 5 = "May" - \li 6 = "June" - \li 7 = "July" - \li 8 = "August" - \li 9 = "September" - \li 10 = "October" - \li 11 = "November" - \li 12 = "December" - \endlist - - The month names will be localized according to the system's - locale settings, i.e. using QLocale::system(). - - Returns an empty string if the date is invalid. - - \sa toString(), shortMonthName(), shortDayName(), longDayName() -*/ - -QString QDate::longMonthName(int month, MonthNameType type) -{ - switch (type) { - case QDate::DateFormat: - return QLocale::system().monthName(month, QLocale::LongFormat); - case QDate::StandaloneFormat: - return QLocale::system().standaloneMonthName(month, QLocale::LongFormat); - } - return QString(); -} - -/*! - \since 4.5 - \deprecated - - Returns the short name of the \a weekday for the representation specified - by \a type. - - The days are enumerated using the following convention: - - \list - \li 1 = "Mon" - \li 2 = "Tue" - \li 3 = "Wed" - \li 4 = "Thu" - \li 5 = "Fri" - \li 6 = "Sat" - \li 7 = "Sun" - \endlist - - The day names will be localized according to the system's - locale settings, i.e. using QLocale::system(). - - Returns an empty string if the date is invalid. - - \sa toString(), shortMonthName(), longMonthName(), longDayName() -*/ - -QString QDate::shortDayName(int weekday, MonthNameType type) -{ - switch (type) { - case QDate::DateFormat: - return QLocale::system().dayName(weekday, QLocale::ShortFormat); - case QDate::StandaloneFormat: - return QLocale::system().standaloneDayName(weekday, QLocale::ShortFormat); - } - return QString(); -} - -/*! - \since 4.5 - \deprecated - - Returns the long name of the \a weekday for the representation specified - by \a type. - - The days are enumerated using the following convention: - - \list - \li 1 = "Monday" - \li 2 = "Tuesday" - \li 3 = "Wednesday" - \li 4 = "Thursday" - \li 5 = "Friday" - \li 6 = "Saturday" - \li 7 = "Sunday" - \endlist - - The day names will be localized according to the system's - locale settings, i.e. using QLocale::system(). - - Returns an empty string if the date is invalid. - - \sa toString(), shortDayName(), shortMonthName(), longMonthName() -*/ - -QString QDate::longDayName(int weekday, MonthNameType type) -{ - switch (type) { - case QDate::DateFormat: - return QLocale::system().dayName(weekday, QLocale::LongFormat); - case QDate::StandaloneFormat: - return QLocale::system().standaloneDayName(weekday, QLocale::LongFormat); - } - return QString(); -} -#endif // textdate && deprecated - -#if QT_CONFIG(datestring) - -#if QT_CONFIG(textdate) -static QString toStringTextDate(QDate date) -{ - const ParsedDate pd = getDateFromJulianDay(date.toJulianDay()); - static const QLatin1Char sp(' '); - return QLocale::system().dayName(date.dayOfWeek(), QLocale::ShortFormat) + sp - + QLocale::system().monthName(pd.month, QLocale::ShortFormat) + sp - + QString::number(pd.day) + sp - + QString::number(pd.year); -} -#endif // textdate - -static QString toStringIsoDate(qint64 jd) -{ - const ParsedDate pd = getDateFromJulianDay(jd); - if (pd.year >= 0 && pd.year <= 9999) - return QString::asprintf("%04d-%02d-%02d", pd.year, pd.month, pd.day); - else - return QString(); -} - -/*! - \fn QString QDate::toString(Qt::DateFormat format) const - - \overload - - Returns the date as a string. The \a format parameter determines - the format of the string. - - If the \a format is Qt::TextDate, the string is formatted in - the default way. QDate::shortDayName() and QDate::shortMonthName() - are used to generate the string, so the day and month names will - be localized names using the system locale, i.e. QLocale::system(). An - example of this formatting is "Sat May 20 1995". - - If the \a format is Qt::ISODate, the string format corresponds - to the ISO 8601 extended specification for representations of - dates and times, taking the form yyyy-MM-dd, where yyyy is the - year, MM is the month of the year (between 01 and 12), and dd is - the day of the month between 01 and 31. - - If the \a format is Qt::SystemLocaleShortDate or - Qt::SystemLocaleLongDate, the string format depends on the locale - settings of the system. Identical to calling - QLocale::system().toString(date, QLocale::ShortFormat) or - QLocale::system().toString(date, QLocale::LongFormat). - - If the \a format is Qt::DefaultLocaleShortDate or - Qt::DefaultLocaleLongDate, the string format depends on the - default application locale. This is the locale set with - QLocale::setDefault(), or the system locale if no default locale - has been set. Identical to calling - \l {QLocale::toString()}{QLocale().toString(date, QLocale::ShortFormat) } or - \l {QLocale::toString()}{QLocale().toString(date, QLocale::LongFormat)}. - - If the \a format is Qt::RFC2822Date, the string is formatted in - an \l{RFC 2822} compatible way. An example of this formatting is - "20 May 1995". - - If the date is invalid, an empty string will be returned. - - \warning The Qt::ISODate format is only valid for years in the - range 0 to 9999. This restriction may apply to locale-aware - formats as well, depending on the locale settings. - - \sa fromString(), shortDayName(), shortMonthName(), QLocale::toString() -*/ -QString QDate::toString(Qt::DateFormat format) const -{ - if (!isValid()) - return QString(); - - switch (format) { - case Qt::SystemLocaleDate: - case Qt::SystemLocaleShortDate: - return QLocale::system().toString(*this, QLocale::ShortFormat); - case Qt::SystemLocaleLongDate: - return QLocale::system().toString(*this, QLocale::LongFormat); - case Qt::LocaleDate: - case Qt::DefaultLocaleShortDate: - return QLocale().toString(*this, QLocale::ShortFormat); - case Qt::DefaultLocaleLongDate: - return QLocale().toString(*this, QLocale::LongFormat); - case Qt::RFC2822Date: - return QLocale::c().toString(*this, QStringViewLiteral("dd MMM yyyy")); - default: -#if QT_CONFIG(textdate) - case Qt::TextDate: - return toStringTextDate(*this); -#endif - case Qt::ISODate: - case Qt::ISODateWithMs: - return toStringIsoDate(jd); - } -} - -/*! - \fn QString QDate::toString(const QString &format) const - \fn QString QDate::toString(QStringView format) const - - Returns the date as a string. The \a format parameter determines - the format of the result string. - - These expressions may be used: - - \table - \header \li Expression \li Output - \row \li d \li the day as number without a leading zero (1 to 31) - \row \li dd \li the day as number with a leading zero (01 to 31) - \row \li ddd - \li the abbreviated localized day name (e.g. 'Mon' to 'Sun'). - Uses the system locale to localize the name, i.e. QLocale::system(). - \row \li dddd - \li the long localized day name (e.g. 'Monday' to 'Sunday'). - Uses the system locale to localize the name, i.e. QLocale::system(). - \row \li M \li the month as number without a leading zero (1 to 12) - \row \li MM \li the month as number with a leading zero (01 to 12) - \row \li MMM - \li the abbreviated localized month name (e.g. 'Jan' to 'Dec'). - Uses the system locale to localize the name, i.e. QLocale::system(). - \row \li MMMM - \li the long localized month name (e.g. 'January' to 'December'). - Uses the system locale to localize the name, i.e. QLocale::system(). - \row \li yy \li the year as two digit number (00 to 99) - \row \li yyyy \li the year as four digit number. If the year is negative, - a minus sign is prepended in addition. - \endtable - - Any sequence of characters enclosed in single quotes will be included - verbatim in the output string (stripped of the quotes), even if it contains - formatting characters. Two consecutive single quotes ("''") are replaced by - a single quote in the output. All other characters in the format string are - included verbatim in the output string. - - Formats without separators (e.g. "ddMM") are supported but must be used with - care, as the resulting strings aren't always reliably readable (e.g. if "dM" - produces "212" it could mean either the 2nd of December or the 21st of - February). - - Example format strings (assuming that the QDate is the 20 July - 1969): - - \table - \header \li Format \li Result - \row \li dd.MM.yyyy \li 20.07.1969 - \row \li ddd MMMM d yy \li Sun July 20 69 - \row \li 'The day is' dddd \li The day is Sunday - \endtable - - If the datetime is invalid, an empty string will be returned. - - \sa fromString(), QDateTime::toString(), QTime::toString(), QLocale::toString() - -*/ -QString QDate::toString(QStringView format) const -{ - return QLocale::system().toString(*this, format); // QLocale::c() ### Qt6 -} - -#if QT_STRINGVIEW_LEVEL < 2 -QString QDate::toString(const QString &format) const -{ - return toString(qToStringViewIgnoringNull(format)); -} -#endif - -#endif // datestring - -/*! - \fn bool QDate::setYMD(int y, int m, int d) - - \deprecated in 5.0, use setDate() instead. - - Sets the date's year \a y, month \a m, and day \a d. - - If \a y is in the range 0 to 99, it is interpreted as 1900 to - 1999. - Returns \c false if the date is invalid. - - Use setDate() instead. -*/ - -/*! - \since 4.2 - - Sets the date's \a year, \a month, and \a day. Returns \c true if - the date is valid; otherwise returns \c false. - - If the specified date is invalid, the QDate object is set to be - invalid. - - \sa isValid() -*/ -bool QDate::setDate(int year, int month, int day) -{ - if (isValid(year, month, day)) - jd = julianDayFromDate(year, month, day); - else - jd = nullJd(); - - return isValid(); -} - -/*! - \since 4.5 - - Extracts the date's year, month, and day, and assigns them to - *\a year, *\a month, and *\a day. The pointers may be null. - - Returns 0 if the date is invalid. - - \note In Qt versions prior to 5.7, this function is marked as non-\c{const}. - - \sa year(), month(), day(), isValid() -*/ -void QDate::getDate(int *year, int *month, int *day) const -{ - ParsedDate pd = { 0, 0, 0 }; - if (isValid()) - pd = getDateFromJulianDay(jd); - - if (year) - *year = pd.year; - if (month) - *month = pd.month; - if (day) - *day = pd.day; -} - -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) -/*! - \overload - \internal -*/ -void QDate::getDate(int *year, int *month, int *day) -{ - qAsConst(*this).getDate(year, month, day); -} -#endif // < Qt 6 - -/*! - Returns a QDate object containing a date \a ndays later than the - date of this object (or earlier if \a ndays is negative). - - Returns a null date if the current date is invalid or the new date is - out of range. - - \sa addMonths(), addYears(), daysTo() -*/ - -QDate QDate::addDays(qint64 ndays) const -{ - if (isNull()) - return QDate(); - - // Due to limits on minJd() and maxJd() we know that any overflow - // will be invalid and caught by fromJulianDay(). - return fromJulianDay(jd + ndays); -} - -/*! - Returns a QDate object containing a date \a nmonths later than the - date of this object (or earlier if \a nmonths is negative). - - \note If the ending day/month combination does not exist in the - resulting month/year, this function will return a date that is the - latest valid date. - - \sa addDays(), addYears() -*/ - -QDate QDate::addMonths(int nmonths) const -{ - if (!isValid()) - return QDate(); - if (!nmonths) - return *this; - - int old_y, y, m, d; - { - const ParsedDate pd = getDateFromJulianDay(jd); - y = pd.year; - m = pd.month; - d = pd.day; - } - old_y = y; - - bool increasing = nmonths > 0; - - while (nmonths != 0) { - if (nmonths < 0 && nmonths + 12 <= 0) { - y--; - nmonths+=12; - } else if (nmonths < 0) { - m+= nmonths; - nmonths = 0; - if (m <= 0) { - --y; - m += 12; - } - } else if (nmonths - 12 >= 0) { - y++; - nmonths -= 12; - } else if (m == 12) { - y++; - m = 0; - } else { - m += nmonths; - nmonths = 0; - if (m > 12) { - ++y; - m -= 12; - } - } - } - - // was there a sign change? - if ((old_y > 0 && y <= 0) || - (old_y < 0 && y >= 0)) - // yes, adjust the date by +1 or -1 years - y += increasing ? +1 : -1; - - return fixedDate(y, m, d); -} - -/*! - Returns a QDate object containing a date \a nyears later than the - date of this object (or earlier if \a nyears is negative). - - \note If the ending day/month combination does not exist in the - resulting year (i.e., if the date was Feb 29 and the final year is - not a leap year), this function will return a date that is the - latest valid date (that is, Feb 28). - - \sa addDays(), addMonths() -*/ - -QDate QDate::addYears(int nyears) const -{ - if (!isValid()) - return QDate(); - - ParsedDate pd = getDateFromJulianDay(jd); - - int old_y = pd.year; - pd.year += nyears; - - // was there a sign change? - if ((old_y > 0 && pd.year <= 0) || - (old_y < 0 && pd.year >= 0)) - // yes, adjust the date by +1 or -1 years - pd.year += nyears > 0 ? +1 : -1; - - return fixedDate(pd.year, pd.month, pd.day); -} - -/*! - Returns the number of days from this date to \a d (which is - negative if \a d is earlier than this date). - - Returns 0 if either date is invalid. - - Example: - \snippet code/src_corelib_tools_qdatetime.cpp 0 - - \sa addDays() -*/ - -qint64 QDate::daysTo(const QDate &d) const -{ - if (isNull() || d.isNull()) - return 0; - - // Due to limits on minJd() and maxJd() we know this will never overflow - return d.jd - jd; -} - - -/*! - \fn bool QDate::operator==(const QDate &d) const - - Returns \c true if this date is equal to \a d; otherwise returns - false. - -*/ - -/*! - \fn bool QDate::operator!=(const QDate &d) const - - Returns \c true if this date is different from \a d; otherwise - returns \c false. -*/ - -/*! - \fn bool QDate::operator<(const QDate &d) const - - Returns \c true if this date is earlier than \a d; otherwise returns - false. -*/ - -/*! - \fn bool QDate::operator<=(const QDate &d) const - - Returns \c true if this date is earlier than or equal to \a d; - otherwise returns \c false. -*/ - -/*! - \fn bool QDate::operator>(const QDate &d) const - - Returns \c true if this date is later than \a d; otherwise returns - false. -*/ - -/*! - \fn bool QDate::operator>=(const QDate &d) const - - Returns \c true if this date is later than or equal to \a d; - otherwise returns \c false. -*/ - -/*! - \fn QDate::currentDate() - Returns the current date, as reported by the system clock. - - \sa QTime::currentTime(), QDateTime::currentDateTime() -*/ - -#if QT_CONFIG(datestring) -/*! - Returns the QDate represented by the \a string, using the - \a format given, or an invalid date if the string cannot be - parsed. - - Note for Qt::TextDate: It is recommended that you use the - English short month names (e.g. "Jan"). Although localized month - names can also be used, they depend on the user's locale settings. - - \sa toString(), QLocale::toDate() -*/ - -QDate QDate::fromString(const QString &string, Qt::DateFormat format) -{ - if (string.isEmpty()) - return QDate(); - - switch (format) { - case Qt::SystemLocaleDate: - case Qt::SystemLocaleShortDate: - return QLocale::system().toDate(string, QLocale::ShortFormat); - case Qt::SystemLocaleLongDate: - return QLocale::system().toDate(string, QLocale::LongFormat); - case Qt::LocaleDate: - case Qt::DefaultLocaleShortDate: - return QLocale().toDate(string, QLocale::ShortFormat); - case Qt::DefaultLocaleLongDate: - return QLocale().toDate(string, QLocale::LongFormat); - case Qt::RFC2822Date: - return rfcDateImpl(string).date; - default: -#if QT_CONFIG(textdate) - case Qt::TextDate: { - QVector parts = string.splitRef(QLatin1Char(' '), QString::SkipEmptyParts); - - if (parts.count() != 4) - return QDate(); - - QStringRef monthName = parts.at(1); - const int month = fromShortMonthName(monthName); - if (month == -1) { - // Month name matches neither English nor other localised name. - return QDate(); - } - - bool ok = false; - int year = parts.at(3).toInt(&ok); - if (!ok) - return QDate(); - - return QDate(year, month, parts.at(2).toInt()); - } -#endif // textdate - case Qt::ISODate: { - // Semi-strict parsing, must be long enough and have non-numeric separators - if (string.size() < 10 || string.at(4).isDigit() || string.at(7).isDigit() - || (string.size() > 10 && string.at(10).isDigit())) { - return QDate(); - } - const int year = string.midRef(0, 4).toInt(); - if (year <= 0 || year > 9999) - return QDate(); - return QDate(year, string.midRef(5, 2).toInt(), string.midRef(8, 2).toInt()); - } - } - return QDate(); -} - -/*! - Returns the QDate represented by the \a string, using the \a - format given, or an invalid date if the string cannot be parsed. - - These expressions may be used for the format: - - \table - \header \li Expression \li Output - \row \li d \li The day as a number without a leading zero (1 to 31) - \row \li dd \li The day as a number with a leading zero (01 to 31) - \row \li ddd - \li The abbreviated localized day name (e.g. 'Mon' to 'Sun'). - Uses the system locale to localize the name, i.e. QLocale::system(). - \row \li dddd - \li The long localized day name (e.g. 'Monday' to 'Sunday'). - Uses the system locale to localize the name, i.e. QLocale::system(). - \row \li M \li The month as a number without a leading zero (1 to 12) - \row \li MM \li The month as a number with a leading zero (01 to 12) - \row \li MMM - \li The abbreviated localized month name (e.g. 'Jan' to 'Dec'). - Uses the system locale to localize the name, i.e. QLocale::system(). - \row \li MMMM - \li The long localized month name (e.g. 'January' to 'December'). - Uses the system locale to localize the name, i.e. QLocale::system(). - \row \li yy \li The year as two digit number (00 to 99) - \row \li yyyy \li The year as four digit number. If the year is negative, - a minus sign is prepended in addition. - \endtable - - All other input characters will be treated as text. Any sequence - of characters that are enclosed in single quotes will also be - treated as text and will not be used as an expression. For example: - - \snippet code/src_corelib_tools_qdatetime.cpp 1 - - If the format is not satisfied, an invalid QDate is returned. The - expressions that don't expect leading zeroes (d, M) will be - greedy. This means that they will use two digits even if this - will put them outside the accepted range of values and leaves too - few digits for other sections. For example, the following format - string could have meant January 30 but the M will grab two - digits, resulting in an invalid date: - - \snippet code/src_corelib_tools_qdatetime.cpp 2 - - For any field that is not represented in the format the following - defaults are used: - - \table - \header \li Field \li Default value - \row \li Year \li 1900 - \row \li Month \li 1 - \row \li Day \li 1 - \endtable - - The following examples demonstrate the default values: - - \snippet code/src_corelib_tools_qdatetime.cpp 3 - - \sa toString(), QDateTime::fromString(), QTime::fromString(), - QLocale::toDate() -*/ - -QDate QDate::fromString(const QString &string, const QString &format) -{ - QDate date; -#if QT_CONFIG(datetimeparser) - QDateTimeParser dt(QVariant::Date, QDateTimeParser::FromString); - // dt.setDefaultLocale(QLocale::c()); ### Qt 6 - if (dt.parseFormat(format)) - dt.fromString(string, &date, 0); -#else - Q_UNUSED(string); - Q_UNUSED(format); -#endif - return date; -} -#endif // datestring - -/*! - \overload - - Returns \c true if the specified date (\a year, \a month, and \a - day) is valid; otherwise returns \c false. - - Example: - \snippet code/src_corelib_tools_qdatetime.cpp 4 - - \sa isNull(), setDate() -*/ - -bool QDate::isValid(int year, int month, int day) -{ - // There is no year 0 in the Gregorian calendar. - return year && day > 0 && month > 0 && month <= 12 && - day <= (month == 2 ? isLeapYear(year) ? 29 : 28 : daysInUsualMonth(month)); -} - -/*! - \fn bool QDate::isLeapYear(int year) - - Returns \c true if the specified \a year is a leap year; otherwise - returns \c false. -*/ - -bool QDate::isLeapYear(int y) -{ - // No year 0 in Gregorian calendar, so -1, -5, -9 etc are leap years - if ( y < 1) - ++y; - - return (y % 4 == 0 && y % 100 != 0) || y % 400 == 0; -} - -/*! \fn static QDate QDate::fromJulianDay(qint64 jd) - - Converts the Julian day \a jd to a QDate. - - \sa toJulianDay() -*/ - -/*! \fn int QDate::toJulianDay() const - - Converts the date to a Julian day. - - \sa fromJulianDay() -*/ - -/***************************************************************************** - QTime member functions - *****************************************************************************/ - -/*! - \class QTime - \inmodule QtCore - \reentrant - - \brief The QTime class provides clock time functions. - - - A QTime object contains a clock time, which it can express as the numbers of - hours, minutes, seconds, and milliseconds since midnight. It provides - functions for comparing times and for manipulating a time by adding a number - of milliseconds. - - QTime uses the 24-hour clock format; it has no concept of AM/PM. - Unlike QDateTime, QTime knows nothing about time zones or - daylight-saving time (DST). - - A QTime object is typically created either by giving the number - of hours, minutes, seconds, and milliseconds explicitly, or by - using the static function currentTime(), which creates a QTime - object that contains the system's local time. Note that the - accuracy depends on the accuracy of the underlying operating - system; not all systems provide 1-millisecond accuracy. - - The hour(), minute(), second(), and msec() functions provide - access to the number of hours, minutes, seconds, and milliseconds - of the time. The same information is provided in textual format by - the toString() function. - - The addSecs() and addMSecs() functions provide the time a given - number of seconds or milliseconds later than a given time. - Correspondingly, the number of seconds or milliseconds - between two times can be found using secsTo() or msecsTo(). - - QTime provides a full set of operators to compare two QTime - objects; an earlier time is considered smaller than a later one; - if A.msecsTo(B) is positive, then A < B. - - \sa QDate, QDateTime -*/ - -/*! - \fn QTime::QTime() - - Constructs a null time object. For a null time, isNull() returns \c true and - isValid() returns \c false. If you need a zero time, use QTime(0, 0). For - the start of a day, see QDate::startOfDay(). - - \sa isNull(), isValid() -*/ - -/*! - Constructs a time with hour \a h, minute \a m, seconds \a s and - milliseconds \a ms. - - \a h must be in the range 0 to 23, \a m and \a s must be in the - range 0 to 59, and \a ms must be in the range 0 to 999. - - \sa isValid() -*/ - -QTime::QTime(int h, int m, int s, int ms) -{ - setHMS(h, m, s, ms); -} - - -/*! - \fn bool QTime::isNull() const - - Returns \c true if the time is null (i.e., the QTime object was - constructed using the default constructor); otherwise returns - false. A null time is also an invalid time. - - \sa isValid() -*/ - -/*! - Returns \c true if the time is valid; otherwise returns \c false. For example, - the time 23:30:55.746 is valid, but 24:12:30 is invalid. - - \sa isNull() -*/ - -bool QTime::isValid() const -{ - return mds > NullTime && mds < MSECS_PER_DAY; -} - - -/*! - Returns the hour part (0 to 23) of the time. - - Returns -1 if the time is invalid. - - \sa minute(), second(), msec() -*/ - -int QTime::hour() const -{ - if (!isValid()) - return -1; - - return ds() / MSECS_PER_HOUR; -} - -/*! - Returns the minute part (0 to 59) of the time. - - Returns -1 if the time is invalid. - - \sa hour(), second(), msec() -*/ - -int QTime::minute() const -{ - if (!isValid()) - return -1; - - return (ds() % MSECS_PER_HOUR) / MSECS_PER_MIN; -} - -/*! - Returns the second part (0 to 59) of the time. - - Returns -1 if the time is invalid. - - \sa hour(), minute(), msec() -*/ - -int QTime::second() const -{ - if (!isValid()) - return -1; - - return (ds() / 1000)%SECS_PER_MIN; -} - -/*! - Returns the millisecond part (0 to 999) of the time. - - Returns -1 if the time is invalid. - - \sa hour(), minute(), second() -*/ - -int QTime::msec() const -{ - if (!isValid()) - return -1; - - return ds() % 1000; -} - -#if QT_CONFIG(datestring) -/*! - \overload - - Returns the time as a string. The \a format parameter determines - the format of the string. - - If \a format is Qt::TextDate, the string format is HH:mm:ss; - e.g. 1 second before midnight would be "23:59:59". - - If \a format is Qt::ISODate, the string format corresponds to the - ISO 8601 extended specification for representations of dates, - represented by HH:mm:ss. To include milliseconds in the ISO 8601 - date, use the \a format Qt::ISODateWithMs, which corresponds to - HH:mm:ss.zzz. - - If the \a format is Qt::SystemLocaleShortDate or - Qt::SystemLocaleLongDate, the string format depends on the locale - settings of the system. Identical to calling - QLocale::system().toString(time, QLocale::ShortFormat) or - QLocale::system().toString(time, QLocale::LongFormat). - - If the \a format is Qt::DefaultLocaleShortDate or - Qt::DefaultLocaleLongDate, the string format depends on the - default application locale. This is the locale set with - QLocale::setDefault(), or the system locale if no default locale - has been set. Identical to calling - - \l {QLocale::toString()}{QLocale().toString(time, QLocale::ShortFormat)} or - \l {QLocale::toString()}{QLocale().toString(time, QLocale::LongFormat)}. - - If the \a format is Qt::RFC2822Date, the string is formatted in - an \l{RFC 2822} compatible way. An example of this formatting is - "23:59:20". - - If the time is invalid, an empty string will be returned. - - \sa fromString(), QDate::toString(), QDateTime::toString(), QLocale::toString() -*/ - -QString QTime::toString(Qt::DateFormat format) const -{ - if (!isValid()) - return QString(); - - switch (format) { - case Qt::SystemLocaleDate: - case Qt::SystemLocaleShortDate: - return QLocale::system().toString(*this, QLocale::ShortFormat); - case Qt::SystemLocaleLongDate: - return QLocale::system().toString(*this, QLocale::LongFormat); - case Qt::LocaleDate: - case Qt::DefaultLocaleShortDate: - return QLocale().toString(*this, QLocale::ShortFormat); - case Qt::DefaultLocaleLongDate: - return QLocale().toString(*this, QLocale::LongFormat); - case Qt::ISODateWithMs: - return QString::asprintf("%02d:%02d:%02d.%03d", hour(), minute(), second(), msec()); - case Qt::RFC2822Date: - case Qt::ISODate: - case Qt::TextDate: - default: - return QString::asprintf("%02d:%02d:%02d", hour(), minute(), second()); - } -} - -/*! - \fn QString QTime::toString(const QString &format) const - \fn QString QTime::toString(QStringView format) const - - Returns the time as a string. The \a format parameter determines - the format of the result string. - - These expressions may be used: - - \table - \header \li Expression \li Output - \row \li h - \li the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display) - \row \li hh - \li the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display) - \row \li H - \li the hour without a leading zero (0 to 23, even with AM/PM display) - \row \li HH - \li the hour with a leading zero (00 to 23, even with AM/PM display) - \row \li m \li the minute without a leading zero (0 to 59) - \row \li mm \li the minute with a leading zero (00 to 59) - \row \li s \li the whole second, without any leading zero (0 to 59) - \row \li ss \li the whole second, with a leading zero where applicable (00 to 59) - \row \li z \li the fractional part of the second, to go after a decimal - point, without trailing zeroes (0 to 999). Thus "\c{s.z}" - reports the seconds to full available (millisecond) precision - without trailing zeroes. - \row \li zzz \li the fractional part of the second, to millisecond - precision, including trailing zeroes where applicable (000 to 999). - \row \li AP or A - \li use AM/PM display. \e A/AP will be replaced by either - QLocale::amText() or QLocale::pmText(). - \row \li ap or a - \li use am/pm display. \e a/ap will be replaced by a lower-case version of - QLocale::amText() or QLocale::pmText(). - \row \li t \li the timezone (for example "CEST") - \endtable - - Any sequence of characters enclosed in single quotes will be included - verbatim in the output string (stripped of the quotes), even if it contains - formatting characters. Two consecutive single quotes ("''") are replaced by - a single quote in the output. All other characters in the format string are - included verbatim in the output string. - - Formats without separators (e.g. "ddMM") are supported but must be used with - care, as the resulting strings aren't always reliably readable (e.g. if "dM" - produces "212" it could mean either the 2nd of December or the 21st of - February). - - Example format strings (assuming that the QTime is 14:13:09.042 and the system - locale is \c{en_US}) - - \table - \header \li Format \li Result - \row \li hh:mm:ss.zzz \li 14:13:09.042 - \row \li h:m:s ap \li 2:13:9 pm - \row \li H:m:s a \li 14:13:9 pm - \endtable - - If the time is invalid, an empty string will be returned. - If \a format is empty, the default format "hh:mm:ss" is used. - - \sa fromString(), QDate::toString(), QDateTime::toString(), QLocale::toString() -*/ -QString QTime::toString(QStringView format) const -{ - return QLocale::system().toString(*this, format); // QLocale::c() ### Qt6 -} - -#if QT_STRINGVIEW_VERSION < 2 -QString QTime::toString(const QString &format) const -{ - return toString(qToStringViewIgnoringNull(format)); -} -#endif - -#endif // datestring - -/*! - Sets the time to hour \a h, minute \a m, seconds \a s and - milliseconds \a ms. - - \a h must be in the range 0 to 23, \a m and \a s must be in the - range 0 to 59, and \a ms must be in the range 0 to 999. - Returns \c true if the set time is valid; otherwise returns \c false. - - \sa isValid() -*/ - -bool QTime::setHMS(int h, int m, int s, int ms) -{ - if (!isValid(h,m,s,ms)) { - mds = NullTime; // make this invalid - return false; - } - mds = (h*SECS_PER_HOUR + m*SECS_PER_MIN + s)*1000 + ms; - return true; -} - -/*! - Returns a QTime object containing a time \a s seconds later - than the time of this object (or earlier if \a s is negative). - - Note that the time will wrap if it passes midnight. - - Returns a null time if this time is invalid. - - Example: - - \snippet code/src_corelib_tools_qdatetime.cpp 5 - - \sa addMSecs(), secsTo(), QDateTime::addSecs() -*/ - -QTime QTime::addSecs(int s) const -{ - s %= SECS_PER_DAY; - return addMSecs(s * 1000); -} - -/*! - Returns the number of seconds from this time to \a t. - If \a t is earlier than this time, the number of seconds returned - is negative. - - Because QTime measures time within a day and there are 86400 - seconds in a day, the result is always between -86400 and 86400. - - secsTo() does not take into account any milliseconds. - - Returns 0 if either time is invalid. - - \sa addSecs(), QDateTime::secsTo() -*/ - -int QTime::secsTo(const QTime &t) const -{ - if (!isValid() || !t.isValid()) - return 0; - - // Truncate milliseconds as we do not want to consider them. - int ourSeconds = ds() / 1000; - int theirSeconds = t.ds() / 1000; - return theirSeconds - ourSeconds; -} - -/*! - Returns a QTime object containing a time \a ms milliseconds later - than the time of this object (or earlier if \a ms is negative). - - Note that the time will wrap if it passes midnight. See addSecs() - for an example. - - Returns a null time if this time is invalid. - - \sa addSecs(), msecsTo(), QDateTime::addMSecs() -*/ - -QTime QTime::addMSecs(int ms) const -{ - QTime t; - if (isValid()) { - if (ms < 0) { - // %,/ not well-defined for -ve, so always work with +ve. - int negdays = (MSECS_PER_DAY - ms) / MSECS_PER_DAY; - t.mds = (ds() + ms + negdays * MSECS_PER_DAY) % MSECS_PER_DAY; - } else { - t.mds = (ds() + ms) % MSECS_PER_DAY; - } - } - return t; -} - -/*! - Returns the number of milliseconds from this time to \a t. - If \a t is earlier than this time, the number of milliseconds returned - is negative. - - Because QTime measures time within a day and there are 86400 - seconds in a day, the result is always between -86400000 and - 86400000 ms. - - Returns 0 if either time is invalid. - - \sa secsTo(), addMSecs(), QDateTime::msecsTo() -*/ - -int QTime::msecsTo(const QTime &t) const -{ - if (!isValid() || !t.isValid()) - return 0; - return t.ds() - ds(); -} - - -/*! - \fn bool QTime::operator==(const QTime &t) const - - Returns \c true if this time is equal to \a t; otherwise returns \c false. -*/ - -/*! - \fn bool QTime::operator!=(const QTime &t) const - - Returns \c true if this time is different from \a t; otherwise returns \c false. -*/ - -/*! - \fn bool QTime::operator<(const QTime &t) const - - Returns \c true if this time is earlier than \a t; otherwise returns \c false. -*/ - -/*! - \fn bool QTime::operator<=(const QTime &t) const - - Returns \c true if this time is earlier than or equal to \a t; - otherwise returns \c false. -*/ - -/*! - \fn bool QTime::operator>(const QTime &t) const - - Returns \c true if this time is later than \a t; otherwise returns \c false. -*/ - -/*! - \fn bool QTime::operator>=(const QTime &t) const - - Returns \c true if this time is later than or equal to \a t; - otherwise returns \c false. -*/ - -/*! - \fn QTime QTime::fromMSecsSinceStartOfDay(int msecs) - - Returns a new QTime instance with the time set to the number of \a msecs - since the start of the day, i.e. since 00:00:00. - - If \a msecs falls outside the valid range an invalid QTime will be returned. - - \sa msecsSinceStartOfDay() -*/ - -/*! - \fn int QTime::msecsSinceStartOfDay() const - - Returns the number of msecs since the start of the day, i.e. since 00:00:00. - - \sa fromMSecsSinceStartOfDay() -*/ - -/*! - \fn QTime::currentTime() - - Returns the current time as reported by the system clock. - - Note that the accuracy depends on the accuracy of the underlying - operating system; not all systems provide 1-millisecond accuracy. -*/ - -#if QT_CONFIG(datestring) - -static QTime fromIsoTimeString(const QStringRef &string, Qt::DateFormat format, bool *isMidnight24) -{ - if (isMidnight24) - *isMidnight24 = false; - - const int size = string.size(); - if (size < 5) - return QTime(); - - bool ok = false; - int hour = string.mid(0, 2).toInt(&ok); - if (!ok) - return QTime(); - const int minute = string.mid(3, 2).toInt(&ok); - if (!ok) - return QTime(); - int second = 0; - int msec = 0; - - if (size == 5) { - // HH:mm format - second = 0; - msec = 0; - } else if (string.at(5) == QLatin1Char(',') || string.at(5) == QLatin1Char('.')) { - if (format == Qt::TextDate) - return QTime(); - // ISODate HH:mm.ssssss format - // We only want 5 digits worth of fraction of minute. This follows the existing - // behavior that determines how milliseconds are read; 4 millisecond digits are - // read and then rounded to 3. If we read at most 5 digits for fraction of minute, - // the maximum amount of millisecond digits it will expand to once converted to - // seconds is 4. E.g. 12:34,99999 will expand to 12:34:59.9994. The milliseconds - // will then be rounded up AND clamped to 999. - - const QStringRef minuteFractionStr = string.mid(6, 5); - const long minuteFractionInt = minuteFractionStr.toLong(&ok); - if (!ok) - return QTime(); - const float minuteFraction = double(minuteFractionInt) / (std::pow(double(10), minuteFractionStr.count())); - - const float secondWithMs = minuteFraction * 60; - const float secondNoMs = std::floor(secondWithMs); - const float secondFraction = secondWithMs - secondNoMs; - second = secondNoMs; - msec = qMin(qRound(secondFraction * 1000.0), 999); - } else { - // HH:mm:ss or HH:mm:ss.zzz - second = string.mid(6, 2).toInt(&ok); - if (!ok) - return QTime(); - if (size > 8 && (string.at(8) == QLatin1Char(',') || string.at(8) == QLatin1Char('.'))) { - const QStringRef msecStr(string.mid(9, 4)); - int msecInt = msecStr.isEmpty() ? 0 : msecStr.toInt(&ok); - if (!ok) - return QTime(); - const double secondFraction(msecInt / (std::pow(double(10), msecStr.count()))); - msec = qMin(qRound(secondFraction * 1000.0), 999); - } - } - - const bool isISODate = format == Qt::ISODate || format == Qt::ISODateWithMs; - if (isISODate && hour == 24 && minute == 0 && second == 0 && msec == 0) { - if (isMidnight24) - *isMidnight24 = true; - hour = 0; - } - - return QTime(hour, minute, second, msec); -} - -/*! - Returns the time represented in the \a string as a QTime using the - \a format given, or an invalid time if this is not possible. - - Note that fromString() uses a "C" locale encoded string to convert - milliseconds to a float value. If the default locale is not "C", - this may result in two conversion attempts (if the conversion - fails for the default locale). This should be considered an - implementation detail. - - \sa toString(), QLocale::toTime() -*/ -QTime QTime::fromString(const QString &string, Qt::DateFormat format) -{ - if (string.isEmpty()) - return QTime(); - - switch (format) { - case Qt::SystemLocaleDate: - case Qt::SystemLocaleShortDate: - return QLocale::system().toTime(string, QLocale::ShortFormat); - case Qt::SystemLocaleLongDate: - return QLocale::system().toTime(string, QLocale::LongFormat); - case Qt::LocaleDate: - case Qt::DefaultLocaleShortDate: - return QLocale().toTime(string, QLocale::ShortFormat); - case Qt::DefaultLocaleLongDate: - return QLocale().toTime(string, QLocale::LongFormat); - case Qt::RFC2822Date: - return rfcDateImpl(string).time; - case Qt::ISODate: - case Qt::ISODateWithMs: - case Qt::TextDate: - default: - return fromIsoTimeString(QStringRef(&string), format, 0); - } -} - -/*! - Returns the QTime represented by the \a string, using the \a - format given, or an invalid time if the string cannot be parsed. - - These expressions may be used for the format: - - \table - \header \li Expression \li Output - \row \li h - \li the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display) - \row \li hh - \li the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display) - \row \li m \li the minute without a leading zero (0 to 59) - \row \li mm \li the minute with a leading zero (00 to 59) - \row \li s \li the whole second, without any leading zero (0 to 59) - \row \li ss \li the whole second, with a leading zero where applicable (00 to 59) - \row \li z \li the fractional part of the second, to go after a decimal - point, without trailing zeroes (0 to 999). Thus "\c{s.z}" - reports the seconds to full available (millisecond) precision - without trailing zeroes. - \row \li zzz \li the fractional part of the second, to millisecond - precision, including trailing zeroes where applicable (000 to 999). - \row \li AP - \li interpret as an AM/PM time. \e AP must be either "AM" or "PM". - \row \li ap - \li Interpret as an AM/PM time. \e ap must be either "am" or "pm". - \endtable - - All other input characters will be treated as text. Any sequence - of characters that are enclosed in single quotes will also be - treated as text and not be used as an expression. - - \snippet code/src_corelib_tools_qdatetime.cpp 6 - - If the format is not satisfied, an invalid QTime is returned. - Expressions that do not expect leading zeroes to be given (h, m, s - and z) are greedy. This means that they will use two digits even if - this puts them outside the range of accepted values and leaves too - few digits for other sections. For example, the following string - could have meant 00:07:10, but the m will grab two digits, resulting - in an invalid time: - - \snippet code/src_corelib_tools_qdatetime.cpp 7 - - Any field that is not represented in the format will be set to zero. - For example: - - \snippet code/src_corelib_tools_qdatetime.cpp 8 - - \sa toString(), QDateTime::fromString(), QDate::fromString(), - QLocale::toTime() -*/ - -QTime QTime::fromString(const QString &string, const QString &format) -{ - QTime time; -#if QT_CONFIG(datetimeparser) - QDateTimeParser dt(QVariant::Time, QDateTimeParser::FromString); - // dt.setDefaultLocale(QLocale::c()); ### Qt 6 - if (dt.parseFormat(format)) - dt.fromString(string, 0, &time); -#else - Q_UNUSED(string); - Q_UNUSED(format); -#endif - return time; -} - -#endif // datestring - - -/*! - \overload - - Returns \c true if the specified time is valid; otherwise returns - false. - - The time is valid if \a h is in the range 0 to 23, \a m and - \a s are in the range 0 to 59, and \a ms is in the range 0 to 999. - - Example: - - \snippet code/src_corelib_tools_qdatetime.cpp 9 -*/ - -bool QTime::isValid(int h, int m, int s, int ms) -{ - return (uint)h < 24 && (uint)m < 60 && (uint)s < 60 && (uint)ms < 1000; -} - -#if QT_DEPRECATED_SINCE(5, 14) // ### Qt 6: remove -/*! - Sets this time to the current time. This is practical for timing: - - \snippet code/src_corelib_tools_qdatetime.cpp 10 - - \sa restart(), elapsed(), currentTime() -*/ - -void QTime::start() -{ - *this = currentTime(); -} - -/*! - Sets this time to the current time and returns the number of - milliseconds that have elapsed since the last time start() or - restart() was called. - - This function is guaranteed to be atomic and is thus very handy - for repeated measurements. Call start() to start the first - measurement, and restart() for each later measurement. - - Note that the counter wraps to zero 24 hours after the last call - to start() or restart(). - - \warning If the system's clock setting has been changed since the - last time start() or restart() was called, the result is - undefined. This can happen when daylight-saving time is turned on - or off. - - \sa start(), elapsed(), currentTime() -*/ - -int QTime::restart() -{ - QTime t = currentTime(); - int n = msecsTo(t); - if (n < 0) // passed midnight - n += 86400*1000; - *this = t; - return n; -} - -/*! - Returns the number of milliseconds that have elapsed since the - last time start() or restart() was called. - - Note that the counter wraps to zero 24 hours after the last call - to start() or restart. - - Note that the accuracy depends on the accuracy of the underlying - operating system; not all systems provide 1-millisecond accuracy. - - \warning If the system's clock setting has been changed since the - last time start() or restart() was called, the result is - undefined. This can happen when daylight-saving time is turned on - or off. - - \sa start(), restart() -*/ - -int QTime::elapsed() const -{ - int n = msecsTo(currentTime()); - if (n < 0) // passed midnight - n += 86400 * 1000; - return n; -} -#endif // Use QElapsedTimer instead ! - -/***************************************************************************** - QDateTime static helper functions - *****************************************************************************/ - -// get the types from QDateTime (through QDateTimePrivate) -typedef QDateTimePrivate::QDateTimeShortData ShortData; -typedef QDateTimePrivate::QDateTimeData QDateTimeData; - -// Returns the platform variant of timezone, i.e. the standard time offset -// The timezone external variable is documented as always holding the -// Standard Time offset as seconds west of Greenwich, i.e. UTC+01:00 is -3600 -// Note this may not be historicaly accurate. -// Relies on tzset, mktime, or localtime having been called to populate timezone -static int qt_timezone() -{ -#if defined(_MSC_VER) - long offset; - _get_timezone(&offset); - return offset; -#elif defined(Q_OS_BSD4) && !defined(Q_OS_DARWIN) - time_t clock = time(NULL); - struct tm t; - localtime_r(&clock, &t); - // QTBUG-36080 Workaround for systems without the POSIX timezone - // variable. This solution is not very efficient but fixing it is up to - // the libc implementations. - // - // tm_gmtoff has some important differences compared to the timezone - // variable: - // - It returns the number of seconds east of UTC, and we want the - // number of seconds west of UTC. - // - It also takes DST into account, so we need to adjust it to always - // get the Standard Time offset. - return -t.tm_gmtoff + (t.tm_isdst ? (long)SECS_PER_HOUR : 0L); -#elif defined(Q_OS_INTEGRITY) - return 0; -#else - return timezone; -#endif // Q_OS_WIN -} - -// Returns the tzname, assume tzset has been called already -static QString qt_tzname(QDateTimePrivate::DaylightStatus daylightStatus) -{ - int isDst = (daylightStatus == QDateTimePrivate::DaylightTime) ? 1 : 0; -#if defined(Q_CC_MSVC) - size_t s = 0; - char name[512]; - if (_get_tzname(&s, name, 512, isDst)) - return QString(); - return QString::fromLocal8Bit(name); -#else - return QString::fromLocal8Bit(tzname[isDst]); -#endif // Q_OS_WIN -} - -#if QT_CONFIG(datetimeparser) && QT_CONFIG(timezone) -/* - \internal - Implemented here to share qt_tzname() -*/ -int QDateTimeParser::startsWithLocalTimeZone(const QStringRef name) -{ - QDateTimePrivate::DaylightStatus zones[2] = { - QDateTimePrivate::StandardTime, - QDateTimePrivate::DaylightTime - }; - for (const auto z : zones) { - QString zone(qt_tzname(z)); - if (name.startsWith(zone)) - return zone.size(); - } - return 0; -} -#endif // datetimeparser && timezone - -// Calls the platform variant of mktime for the given date, time and daylightStatus, -// and updates the date, time, daylightStatus and abbreviation with the returned values -// If the date falls outside the 1970 to 2037 range supported by mktime / time_t -// then null date/time will be returned, you should adjust the date first if -// you need a guaranteed result. -static qint64 qt_mktime(QDate *date, QTime *time, QDateTimePrivate::DaylightStatus *daylightStatus, - QString *abbreviation, bool *ok = 0) -{ - const qint64 msec = time->msec(); - int yy, mm, dd; - date->getDate(&yy, &mm, &dd); - - // All other platforms provide standard C library time functions - tm local; - memset(&local, 0, sizeof(local)); // tm_[wy]day plus any non-standard fields - local.tm_sec = time->second(); - local.tm_min = time->minute(); - local.tm_hour = time->hour(); - local.tm_mday = dd; - local.tm_mon = mm - 1; - local.tm_year = yy - 1900; - if (daylightStatus) - local.tm_isdst = int(*daylightStatus); - else - local.tm_isdst = -1; - -#if defined(Q_OS_WIN) - int hh = local.tm_hour; -#endif // Q_OS_WIN - time_t secsSinceEpoch = qMkTime(&local); - if (secsSinceEpoch != time_t(-1)) { - *date = QDate(local.tm_year + 1900, local.tm_mon + 1, local.tm_mday); - *time = QTime(local.tm_hour, local.tm_min, local.tm_sec, msec); -#if defined(Q_OS_WIN) - // Windows mktime for the missing hour subtracts 1 hour from the time - // instead of adding 1 hour. If time differs and is standard time then - // this has happened, so add 2 hours to the time and 1 hour to the msecs - if (local.tm_isdst == 0 && local.tm_hour != hh) { - if (time->hour() >= 22) - *date = date->addDays(1); - *time = time->addSecs(2 * SECS_PER_HOUR); - secsSinceEpoch += SECS_PER_HOUR; - local.tm_isdst = 1; - } -#endif // Q_OS_WIN - if (local.tm_isdst >= 1) { - if (daylightStatus) - *daylightStatus = QDateTimePrivate::DaylightTime; - if (abbreviation) - *abbreviation = qt_tzname(QDateTimePrivate::DaylightTime); - } else if (local.tm_isdst == 0) { - if (daylightStatus) - *daylightStatus = QDateTimePrivate::StandardTime; - if (abbreviation) - *abbreviation = qt_tzname(QDateTimePrivate::StandardTime); - } else { - if (daylightStatus) - *daylightStatus = QDateTimePrivate::UnknownDaylightTime; - if (abbreviation) - *abbreviation = qt_tzname(QDateTimePrivate::StandardTime); - } - if (ok) - *ok = true; - } else { - *date = QDate(); - *time = QTime(); - if (daylightStatus) - *daylightStatus = QDateTimePrivate::UnknownDaylightTime; - if (abbreviation) - *abbreviation = QString(); - if (ok) - *ok = false; - } - - return ((qint64)secsSinceEpoch * 1000) + msec; -} - -// Calls the platform variant of localtime for the given msecs, and updates -// the date, time, and DST status with the returned values. -static bool qt_localtime(qint64 msecsSinceEpoch, QDate *localDate, QTime *localTime, - QDateTimePrivate::DaylightStatus *daylightStatus) -{ - const time_t secsSinceEpoch = msecsSinceEpoch / 1000; - const int msec = msecsSinceEpoch % 1000; - - tm local; - bool valid = false; - - // localtime() is specified to work as if it called tzset(). - // localtime_r() does not have this constraint, so make an explicit call. - // The explicit call should also request the timezone info be re-parsed. - qTzSet(); -#if QT_CONFIG(thread) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) - // Use the reentrant version of localtime() where available - // as is thread-safe and doesn't use a shared static data area - tm *res = 0; - res = localtime_r(&secsSinceEpoch, &local); - if (res) - valid = true; -#elif defined(Q_CC_MSVC) - if (!_localtime64_s(&local, &secsSinceEpoch)) - valid = true; -#else - // Returns shared static data which may be overwritten at any time - // So copy the result asap - tm *res = 0; - res = localtime(&secsSinceEpoch); - if (res) { - local = *res; - valid = true; - } -#endif - if (valid) { - *localDate = QDate(local.tm_year + 1900, local.tm_mon + 1, local.tm_mday); - *localTime = QTime(local.tm_hour, local.tm_min, local.tm_sec, msec); - if (daylightStatus) { - if (local.tm_isdst > 0) - *daylightStatus = QDateTimePrivate::DaylightTime; - else if (local.tm_isdst < 0) - *daylightStatus = QDateTimePrivate::UnknownDaylightTime; - else - *daylightStatus = QDateTimePrivate::StandardTime; - } - return true; - } else { - *localDate = QDate(); - *localTime = QTime(); - if (daylightStatus) - *daylightStatus = QDateTimePrivate::UnknownDaylightTime; - return false; - } -} - -// Converts an msecs value into a date and time -static void msecsToTime(qint64 msecs, QDate *date, QTime *time) -{ - qint64 jd = JULIAN_DAY_FOR_EPOCH; - qint64 ds = 0; - - if (msecs >= MSECS_PER_DAY || msecs <= -MSECS_PER_DAY) { - jd += msecs / MSECS_PER_DAY; - msecs %= MSECS_PER_DAY; - } - - if (msecs < 0) { - ds = MSECS_PER_DAY - msecs - 1; - jd -= ds / MSECS_PER_DAY; - ds = ds % MSECS_PER_DAY; - ds = MSECS_PER_DAY - ds - 1; - } else { - ds = msecs; - } - - if (date) - *date = QDate::fromJulianDay(jd); - if (time) - *time = QTime::fromMSecsSinceStartOfDay(ds); -} - -// Converts a date/time value into msecs -static qint64 timeToMSecs(const QDate &date, const QTime &time) -{ - return ((date.toJulianDay() - JULIAN_DAY_FOR_EPOCH) * MSECS_PER_DAY) - + time.msecsSinceStartOfDay(); -} - -// Convert an MSecs Since Epoch into Local Time -static bool epochMSecsToLocalTime(qint64 msecs, QDate *localDate, QTime *localTime, - QDateTimePrivate::DaylightStatus *daylightStatus = 0) -{ - if (msecs < 0) { - // Docs state any LocalTime before 1970-01-01 will *not* have any Daylight Time applied - // Instead just use the standard offset from UTC to convert to UTC time - qTzSet(); - msecsToTime(msecs - qt_timezone() * 1000, localDate, localTime); - if (daylightStatus) - *daylightStatus = QDateTimePrivate::StandardTime; - return true; - } else if (msecs > (qint64(TIME_T_MAX) * 1000)) { - // Docs state any LocalTime after 2037-12-31 *will* have any DST applied - // but this may fall outside the supported time_t range, so need to fake it. - // Use existing method to fake the conversion, but this is deeply flawed as it may - // apply the conversion from the wrong day number, e.g. if rule is last Sunday of month - // TODO Use QTimeZone when available to apply the future rule correctly - QDate utcDate; - QTime utcTime; - msecsToTime(msecs, &utcDate, &utcTime); - int year, month, day; - utcDate.getDate(&year, &month, &day); - // 2037 is not a leap year, so make sure date isn't Feb 29 - if (month == 2 && day == 29) - --day; - QDate fakeDate(2037, month, day); - qint64 fakeMsecs = QDateTime(fakeDate, utcTime, Qt::UTC).toMSecsSinceEpoch(); - bool res = qt_localtime(fakeMsecs, localDate, localTime, daylightStatus); - *localDate = localDate->addDays(fakeDate.daysTo(utcDate)); - return res; - } else { - // Falls inside time_t suported range so can use localtime - return qt_localtime(msecs, localDate, localTime, daylightStatus); - } -} - -// Convert a LocalTime expressed in local msecs encoding and the corresponding -// DST status into a UTC epoch msecs. Optionally populate the returned -// values from mktime for the adjusted local date and time. -static qint64 localMSecsToEpochMSecs(qint64 localMsecs, - QDateTimePrivate::DaylightStatus *daylightStatus, - QDate *localDate = 0, QTime *localTime = 0, - QString *abbreviation = 0) -{ - QDate dt; - QTime tm; - msecsToTime(localMsecs, &dt, &tm); - - const qint64 msecsMax = qint64(TIME_T_MAX) * 1000; - - if (localMsecs <= qint64(MSECS_PER_DAY)) { - - // Docs state any LocalTime before 1970-01-01 will *not* have any DST applied - - // First, if localMsecs is within +/- 1 day of minimum time_t try mktime in case it does - // fall after minimum and needs proper DST conversion - if (localMsecs >= -qint64(MSECS_PER_DAY)) { - bool valid; - qint64 utcMsecs = qt_mktime(&dt, &tm, daylightStatus, abbreviation, &valid); - if (valid && utcMsecs >= 0) { - // mktime worked and falls in valid range, so use it - if (localDate) - *localDate = dt; - if (localTime) - *localTime = tm; - return utcMsecs; - } - } else { - // If we don't call mktime then need to call tzset to get offset - qTzSet(); - } - // Time is clearly before 1970-01-01 so just use standard offset to convert - qint64 utcMsecs = localMsecs + qt_timezone() * 1000; - if (localDate || localTime) - msecsToTime(localMsecs, localDate, localTime); - if (daylightStatus) - *daylightStatus = QDateTimePrivate::StandardTime; - if (abbreviation) - *abbreviation = qt_tzname(QDateTimePrivate::StandardTime); - return utcMsecs; - - } else if (localMsecs >= msecsMax - MSECS_PER_DAY) { - - // Docs state any LocalTime after 2037-12-31 *will* have any DST applied - // but this may fall outside the supported time_t range, so need to fake it. - - // First, if localMsecs is within +/- 1 day of maximum time_t try mktime in case it does - // fall before maximum and can use proper DST conversion - if (localMsecs <= msecsMax + MSECS_PER_DAY) { - bool valid; - qint64 utcMsecs = qt_mktime(&dt, &tm, daylightStatus, abbreviation, &valid); - if (valid && utcMsecs <= msecsMax) { - // mktime worked and falls in valid range, so use it - if (localDate) - *localDate = dt; - if (localTime) - *localTime = tm; - return utcMsecs; - } - } - // Use existing method to fake the conversion, but this is deeply flawed as it may - // apply the conversion from the wrong day number, e.g. if rule is last Sunday of month - // TODO Use QTimeZone when available to apply the future rule correctly - int year, month, day; - dt.getDate(&year, &month, &day); - // 2037 is not a leap year, so make sure date isn't Feb 29 - if (month == 2 && day == 29) - --day; - QDate fakeDate(2037, month, day); - qint64 fakeDiff = fakeDate.daysTo(dt); - qint64 utcMsecs = qt_mktime(&fakeDate, &tm, daylightStatus, abbreviation); - if (localDate) - *localDate = fakeDate.addDays(fakeDiff); - if (localTime) - *localTime = tm; - QDate utcDate; - QTime utcTime; - msecsToTime(utcMsecs, &utcDate, &utcTime); - utcDate = utcDate.addDays(fakeDiff); - utcMsecs = timeToMSecs(utcDate, utcTime); - return utcMsecs; - - } else { - - // Clearly falls inside 1970-2037 suported range so can use mktime - qint64 utcMsecs = qt_mktime(&dt, &tm, daylightStatus, abbreviation); - if (localDate) - *localDate = dt; - if (localTime) - *localTime = tm; - return utcMsecs; - - } -} - -static inline bool specCanBeSmall(Qt::TimeSpec spec) -{ - return spec == Qt::LocalTime || spec == Qt::UTC; -} - -static inline bool msecsCanBeSmall(qint64 msecs) -{ - if (!QDateTimeData::CanBeSmall) - return false; - - ShortData sd; - sd.msecs = qintptr(msecs); - return sd.msecs == msecs; -} - -static Q_DECL_CONSTEXPR inline -QDateTimePrivate::StatusFlags mergeSpec(QDateTimePrivate::StatusFlags status, Qt::TimeSpec spec) -{ - return QDateTimePrivate::StatusFlags((status & ~QDateTimePrivate::TimeSpecMask) | - (int(spec) << QDateTimePrivate::TimeSpecShift)); -} - -static Q_DECL_CONSTEXPR inline Qt::TimeSpec extractSpec(QDateTimePrivate::StatusFlags status) -{ - return Qt::TimeSpec((status & QDateTimePrivate::TimeSpecMask) >> QDateTimePrivate::TimeSpecShift); -} - -// Set the Daylight Status if LocalTime set via msecs -static Q_DECL_RELAXED_CONSTEXPR inline QDateTimePrivate::StatusFlags -mergeDaylightStatus(QDateTimePrivate::StatusFlags sf, QDateTimePrivate::DaylightStatus status) -{ - sf &= ~QDateTimePrivate::DaylightMask; - if (status == QDateTimePrivate::DaylightTime) { - sf |= QDateTimePrivate::SetToDaylightTime; - } else if (status == QDateTimePrivate::StandardTime) { - sf |= QDateTimePrivate::SetToStandardTime; - } - return sf; -} - -// Get the DST Status if LocalTime set via msecs -static Q_DECL_RELAXED_CONSTEXPR inline -QDateTimePrivate::DaylightStatus extractDaylightStatus(QDateTimePrivate::StatusFlags status) -{ - if (status & QDateTimePrivate::SetToDaylightTime) - return QDateTimePrivate::DaylightTime; - if (status & QDateTimePrivate::SetToStandardTime) - return QDateTimePrivate::StandardTime; - return QDateTimePrivate::UnknownDaylightTime; -} - -static inline qint64 getMSecs(const QDateTimeData &d) -{ - if (d.isShort()) { - // same as, but producing better code - //return d.data.msecs; - return qintptr(d.d) >> 8; - } - return d->m_msecs; -} - -static inline QDateTimePrivate::StatusFlags getStatus(const QDateTimeData &d) -{ - if (d.isShort()) { - // same as, but producing better code - //return StatusFlag(d.data.status); - return QDateTimePrivate::StatusFlag(qintptr(d.d) & 0xFF); - } - return d->m_status; -} - -static inline Qt::TimeSpec getSpec(const QDateTimeData &d) -{ - return extractSpec(getStatus(d)); -} - -#if QT_CONFIG(timezone) -void QDateTimePrivate::setUtcOffsetByTZ(qint64 atMSecsSinceEpoch) -{ - m_offsetFromUtc = m_timeZone.d->offsetFromUtc(atMSecsSinceEpoch); -} -#endif - -// Refresh the LocalTime validity and offset -static void refreshDateTime(QDateTimeData &d) -{ - auto status = getStatus(d); - const auto spec = extractSpec(status); - const qint64 msecs = getMSecs(d); - qint64 epochMSecs = 0; - int offsetFromUtc = 0; - QDate testDate; - QTime testTime; - Q_ASSERT(spec == Qt::TimeZone || spec == Qt::LocalTime); - -#if QT_CONFIG(timezone) - // If not valid time zone then is invalid - if (spec == Qt::TimeZone) { - if (!d->m_timeZone.isValid()) { - status &= ~QDateTimePrivate::ValidDateTime; - } else { - epochMSecs = QDateTimePrivate::zoneMSecsToEpochMSecs(msecs, d->m_timeZone, extractDaylightStatus(status), &testDate, &testTime); - d->setUtcOffsetByTZ(epochMSecs); - } - } -#endif // timezone - - // If not valid date and time then is invalid - if (!(status & QDateTimePrivate::ValidDate) || !(status & QDateTimePrivate::ValidTime)) { - status &= ~QDateTimePrivate::ValidDateTime; - if (status & QDateTimePrivate::ShortData) { - d.data.status = status; - } else { - d->m_status = status; - d->m_offsetFromUtc = 0; - } - return; - } - - // We have a valid date and time and a Qt::LocalTime or Qt::TimeZone that needs calculating - // LocalTime and TimeZone might fall into a "missing" DST transition hour - // Calling toEpochMSecs will adjust the returned date/time if it does - if (spec == Qt::LocalTime) { - auto dstStatus = extractDaylightStatus(status); - epochMSecs = localMSecsToEpochMSecs(msecs, &dstStatus, &testDate, &testTime); - } - if (timeToMSecs(testDate, testTime) == msecs) { - status |= QDateTimePrivate::ValidDateTime; - // Cache the offset to use in offsetFromUtc() - offsetFromUtc = (msecs - epochMSecs) / 1000; - } else { - status &= ~QDateTimePrivate::ValidDateTime; - } - - if (status & QDateTimePrivate::ShortData) { - d.data.status = status; - } else { - d->m_status = status; - d->m_offsetFromUtc = offsetFromUtc; - } -} - -// Check the UTC / offsetFromUTC validity -static void checkValidDateTime(QDateTimeData &d) -{ - auto status = getStatus(d); - auto spec = extractSpec(status); - switch (spec) { - case Qt::OffsetFromUTC: - case Qt::UTC: - // for these, a valid date and a valid time imply a valid QDateTime - if ((status & QDateTimePrivate::ValidDate) && (status & QDateTimePrivate::ValidTime)) - status |= QDateTimePrivate::ValidDateTime; - else - status &= ~QDateTimePrivate::ValidDateTime; - if (status & QDateTimePrivate::ShortData) - d.data.status = status; - else - d->m_status = status; - break; - case Qt::TimeZone: - case Qt::LocalTime: - // for these, we need to check whether the timezone is valid and whether - // the time is valid in that timezone. Expensive, but no other option. - refreshDateTime(d); - break; - } -} - -static void setTimeSpec(QDateTimeData &d, Qt::TimeSpec spec, int offsetSeconds) -{ - auto status = getStatus(d); - status &= ~(QDateTimePrivate::ValidDateTime | QDateTimePrivate::DaylightMask | - QDateTimePrivate::TimeSpecMask); - - switch (spec) { - case Qt::OffsetFromUTC: - if (offsetSeconds == 0) - spec = Qt::UTC; - break; - case Qt::TimeZone: - // Use system time zone instead - spec = Qt::LocalTime; - Q_FALLTHROUGH(); - case Qt::UTC: - case Qt::LocalTime: - offsetSeconds = 0; - break; - } - - status = mergeSpec(status, spec); - if (d.isShort() && offsetSeconds == 0) { - d.data.status = status; - } else { - d.detach(); - d->m_status = status & ~QDateTimePrivate::ShortData; - d->m_offsetFromUtc = offsetSeconds; -#if QT_CONFIG(timezone) - d->m_timeZone = QTimeZone(); -#endif // timezone - } -} - -static void setDateTime(QDateTimeData &d, const QDate &date, const QTime &time) -{ - // If the date is valid and the time is not we set time to 00:00:00 - QTime useTime = time; - if (!useTime.isValid() && date.isValid()) - useTime = QTime::fromMSecsSinceStartOfDay(0); - - QDateTimePrivate::StatusFlags newStatus = 0; - - // Set date value and status - qint64 days = 0; - if (date.isValid()) { - days = date.toJulianDay() - JULIAN_DAY_FOR_EPOCH; - newStatus = QDateTimePrivate::ValidDate; - } - - // Set time value and status - int ds = 0; - if (useTime.isValid()) { - ds = useTime.msecsSinceStartOfDay(); - newStatus |= QDateTimePrivate::ValidTime; - } - - // Set msecs serial value - qint64 msecs = (days * MSECS_PER_DAY) + ds; - if (d.isShort()) { - // let's see if we can keep this short - if (msecsCanBeSmall(msecs)) { - // yes, we can - d.data.msecs = qintptr(msecs); - d.data.status &= ~(QDateTimePrivate::ValidityMask | QDateTimePrivate::DaylightMask); - d.data.status |= newStatus; - } else { - // nope... - d.detach(); - } - } - if (!d.isShort()) { - d.detach(); - d->m_msecs = msecs; - d->m_status &= ~(QDateTimePrivate::ValidityMask | QDateTimePrivate::DaylightMask); - d->m_status |= newStatus; - } - - // Set if date and time are valid - checkValidDateTime(d); -} - -static QPair getDateTime(const QDateTimeData &d) -{ - QPair result; - qint64 msecs = getMSecs(d); - auto status = getStatus(d); - msecsToTime(msecs, &result.first, &result.second); - - if (!status.testFlag(QDateTimePrivate::ValidDate)) - result.first = QDate(); - - if (!status.testFlag(QDateTimePrivate::ValidTime)) - result.second = QTime(); - - return result; -} - -/***************************************************************************** - QDateTime::Data member functions - *****************************************************************************/ - -inline QDateTime::Data::Data() -{ - // default-constructed data has a special exception: - // it can be small even if CanBeSmall == false - // (optimization so we don't allocate memory in the default constructor) - quintptr value = quintptr(mergeSpec(QDateTimePrivate::ShortData, Qt::LocalTime)); - d = reinterpret_cast(value); -} - -inline QDateTime::Data::Data(Qt::TimeSpec spec) -{ - if (CanBeSmall && Q_LIKELY(specCanBeSmall(spec))) { - d = reinterpret_cast(quintptr(mergeSpec(QDateTimePrivate::ShortData, spec))); - } else { - // the structure is too small, we need to detach - d = new QDateTimePrivate; - d->ref.ref(); - d->m_status = mergeSpec(0, spec); - } -} - -inline QDateTime::Data::Data(const Data &other) - : d(other.d) -{ - if (!isShort()) { - // check if we could shrink - if (specCanBeSmall(extractSpec(d->m_status)) && msecsCanBeSmall(d->m_msecs)) { - ShortData sd; - sd.msecs = qintptr(d->m_msecs); - sd.status = d->m_status | QDateTimePrivate::ShortData; - data = sd; - } else { - // no, have to keep it big - d->ref.ref(); - } - } -} - -inline QDateTime::Data::Data(Data &&other) - : d(other.d) -{ - // reset the other to a short state - Data dummy; - Q_ASSERT(dummy.isShort()); - other.d = dummy.d; -} - -inline QDateTime::Data &QDateTime::Data::operator=(const Data &other) -{ - if (d == other.d) - return *this; - - auto x = d; - d = other.d; - if (!other.isShort()) { - // check if we could shrink - if (specCanBeSmall(extractSpec(other.d->m_status)) && msecsCanBeSmall(other.d->m_msecs)) { - ShortData sd; - sd.msecs = qintptr(other.d->m_msecs); - sd.status = other.d->m_status | QDateTimePrivate::ShortData; - data = sd; - } else { - // no, have to keep it big - other.d->ref.ref(); - } - } - - if (!(quintptr(x) & QDateTimePrivate::ShortData) && !x->ref.deref()) - delete x; - return *this; -} - -inline QDateTime::Data::~Data() -{ - if (!isShort() && !d->ref.deref()) - delete d; -} - -inline bool QDateTime::Data::isShort() const -{ - bool b = quintptr(d) & QDateTimePrivate::ShortData; - - // sanity check: - Q_ASSERT(b || (d->m_status & QDateTimePrivate::ShortData) == 0); - - // even if CanBeSmall = false, we have short data for a default-constructed - // QDateTime object. But it's unlikely. - if (CanBeSmall) - return Q_LIKELY(b); - return Q_UNLIKELY(b); -} - -inline void QDateTime::Data::detach() -{ - QDateTimePrivate *x; - bool wasShort = isShort(); - if (wasShort) { - // force enlarging - x = new QDateTimePrivate; - x->m_status = QDateTimePrivate::StatusFlag(data.status & ~QDateTimePrivate::ShortData); - x->m_msecs = data.msecs; - } else { - if (d->ref.load() == 1) - return; - - x = new QDateTimePrivate(*d); - } - - x->ref.store(1); - if (!wasShort && !d->ref.deref()) - delete d; - d = x; -} - -inline const QDateTimePrivate *QDateTime::Data::operator->() const -{ - Q_ASSERT(!isShort()); - return d; -} - -inline QDateTimePrivate *QDateTime::Data::operator->() -{ - // should we attempt to detach here? - Q_ASSERT(!isShort()); - Q_ASSERT(d->ref.load() == 1); - return d; -} - -/***************************************************************************** - QDateTimePrivate member functions - *****************************************************************************/ - -Q_NEVER_INLINE -QDateTime::Data QDateTimePrivate::create(const QDate &toDate, const QTime &toTime, Qt::TimeSpec toSpec, - int offsetSeconds) -{ - QDateTime::Data result(toSpec); - setTimeSpec(result, toSpec, offsetSeconds); - setDateTime(result, toDate, toTime); - return result; -} - -#if QT_CONFIG(timezone) -inline QDateTime::Data QDateTimePrivate::create(const QDate &toDate, const QTime &toTime, - const QTimeZone &toTimeZone) -{ - QDateTime::Data result(Qt::TimeZone); - Q_ASSERT(!result.isShort()); - - result.d->m_status = mergeSpec(result.d->m_status, Qt::TimeZone); - result.d->m_timeZone = toTimeZone; - setDateTime(result, toDate, toTime); - return result; -} - -// Convert a TimeZone time expressed in zone msecs encoding into a UTC epoch msecs -// DST transitions are disambiguated by hint. -inline qint64 QDateTimePrivate::zoneMSecsToEpochMSecs(qint64 zoneMSecs, const QTimeZone &zone, - DaylightStatus hint, - QDate *zoneDate, QTime *zoneTime) -{ - // Get the effective data from QTimeZone - QTimeZonePrivate::Data data = zone.d->dataForLocalTime(zoneMSecs, int(hint)); - // Docs state any time before 1970-01-01 will *not* have any DST applied - // but all affected times afterwards will have DST applied. - if (data.atMSecsSinceEpoch < 0) { - msecsToTime(zoneMSecs, zoneDate, zoneTime); - return zoneMSecs - data.standardTimeOffset * 1000; - } else { - msecsToTime(data.atMSecsSinceEpoch + data.offsetFromUtc * 1000, zoneDate, zoneTime); - return data.atMSecsSinceEpoch; - } -} -#endif // timezone - -/***************************************************************************** - QDateTime member functions - *****************************************************************************/ - -/*! - \class QDateTime - \inmodule QtCore - \ingroup shared - \reentrant - \brief The QDateTime class provides date and time functions. - - - A QDateTime object encodes a calendar date and a clock time (a - "datetime"). It combines features of the QDate and QTime classes. - It can read the current datetime from the system clock. It - provides functions for comparing datetimes and for manipulating a - datetime by adding a number of seconds, days, months, or years. - - A QDateTime object is typically created either by giving a date - and time explicitly in the constructor, or by using the static - function currentDateTime() that returns a QDateTime object set - to the system clock's time. The date and time can be changed with - setDate() and setTime(). A datetime can also be set using the - setTime_t() function that takes a POSIX-standard "number of - seconds since 00:00:00 on January 1, 1970" value. The fromString() - function returns a QDateTime, given a string and a date format - used to interpret the date within the string. - - The date() and time() functions provide access to the date and - time parts of the datetime. The same information is provided in - textual format by the toString() function. - - QDateTime provides a full set of operators to compare two - QDateTime objects, where smaller means earlier and larger means - later. - - You can increment (or decrement) a datetime by a given number of - milliseconds using addMSecs(), seconds using addSecs(), or days - using addDays(). Similarly, you can use addMonths() and addYears(). - The daysTo() function returns the number of days between two datetimes, - secsTo() returns the number of seconds between two datetimes, and - msecsTo() returns the number of milliseconds between two datetimes. - - QDateTime can store datetimes as \l{Qt::LocalTime}{local time} or - as \l{Qt::UTC}{UTC}. QDateTime::currentDateTime() returns a - QDateTime expressed as local time; use toUTC() to convert it to - UTC. You can also use timeSpec() to find out if a QDateTime - object stores a UTC time or a local time. Operations such as - addSecs() and secsTo() are aware of daylight-saving time (DST). - - \note QDateTime does not account for leap seconds. - - \section1 Remarks - - \section2 No Year 0 - - There is no year 0. Dates in that year are considered invalid. The - year -1 is the year "1 before Christ" or "1 before current era." - The day before 1 January 1 CE is 31 December 1 BCE. - - \section2 Range of Valid Dates - - The range of valid values able to be stored in QDateTime is dependent on - the internal storage implementation. QDateTime is currently stored in a - qint64 as a serial msecs value encoding the date and time. This restricts - the date range to about +/- 292 million years, compared to the QDate range - of +/- 2 billion years. Care must be taken when creating a QDateTime with - extreme values that you do not overflow the storage. The exact range of - supported values varies depending on the Qt::TimeSpec and time zone. - - \section2 Use of System Timezone - - QDateTime uses the system's time zone information to determine the - offset of local time from UTC. If the system is not configured - correctly or not up-to-date, QDateTime will give wrong results as - well. - - \section2 Daylight-Saving Time (DST) - - QDateTime takes into account the system's time zone information - when dealing with DST. On modern Unix systems, this means it - applies the correct historical DST data whenever possible. On - Windows, where the system doesn't support historical DST data, - historical accuracy is not maintained with respect to DST. - - The range of valid dates taking DST into account is 1970-01-01 to - the present, and rules are in place for handling DST correctly - until 2037-12-31, but these could change. For dates falling - outside that range, QDateTime makes a \e{best guess} using the - rules for year 1970 or 2037, but we can't guarantee accuracy. This - means QDateTime doesn't take into account changes in a locale's - time zone before 1970, even if the system's time zone database - supports that information. - - QDateTime takes into consideration the Standard Time to Daylight-Saving Time - transition. For example if the transition is at 2am and the clock goes - forward to 3am, then there is a "missing" hour from 02:00:00 to 02:59:59.999 - which QDateTime considers to be invalid. Any date maths performed - will take this missing hour into account and return a valid result. - - \section2 Offset From UTC - - A Qt::TimeSpec of Qt::OffsetFromUTC is also supported. This allows you - to define a QDateTime relative to UTC at a fixed offset of a given number - of seconds from UTC. For example, an offset of +3600 seconds is one hour - ahead of UTC and is usually written in ISO standard notation as - "UTC+01:00". Daylight-Saving Time never applies with this TimeSpec. - - There is no explicit size restriction to the offset seconds, but there is - an implicit limit imposed when using the toString() and fromString() - methods which use a format of [+|-]hh:mm, effectively limiting the range - to +/- 99 hours and 59 minutes and whole minutes only. Note that currently - no time zone lies outside the range of +/- 14 hours. - - \section2 Time Zone Support - - A Qt::TimeSpec of Qt::TimeZone is also supported in conjunction with the - QTimeZone class. This allows you to define a datetime in a named time zone - adhering to a consistent set of daylight-saving transition rules. For - example a time zone of "Europe/Berlin" will apply the daylight-saving - rules as used in Germany since 1970. Note that the transition rules - applied depend on the platform support. See the QTimeZone documentation - for more details. - - \sa QDate, QTime, QDateTimeEdit, QTimeZone -*/ - -/*! - Constructs a null datetime (i.e. null date and null time). A null - datetime is invalid, since the date is invalid. - - \sa isValid() -*/ -QDateTime::QDateTime() noexcept(Data::CanBeSmall) -{ -} - - -/*! - Constructs a datetime with the given \a date, a valid - time(00:00:00.000), and sets the timeSpec() to Qt::LocalTime. -*/ - -QDateTime::QDateTime(const QDate &date) - : d(QDateTimePrivate::create(date, QTime(0, 0), Qt::LocalTime, 0)) -{ -} - -/*! - Constructs a datetime with the given \a date and \a time, using - the time specification defined by \a spec. - - If \a date is valid and \a time is not, the time will be set to midnight. - - If \a spec is Qt::OffsetFromUTC then it will be set to Qt::UTC, i.e. an - offset of 0 seconds. To create a Qt::OffsetFromUTC datetime use the - correct constructor. - - If \a spec is Qt::TimeZone then the spec will be set to Qt::LocalTime, - i.e. the current system time zone. To create a Qt::TimeZone datetime - use the correct constructor. -*/ - -QDateTime::QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec) - : d(QDateTimePrivate::create(date, time, spec, 0)) -{ -} - -/*! - \since 5.2 - - Constructs a datetime with the given \a date and \a time, using - the time specification defined by \a spec and \a offsetSeconds seconds. - - If \a date is valid and \a time is not, the time will be set to midnight. - - If the \a spec is not Qt::OffsetFromUTC then \a offsetSeconds will be ignored. - - If the \a spec is Qt::OffsetFromUTC and \a offsetSeconds is 0 then the - timeSpec() will be set to Qt::UTC, i.e. an offset of 0 seconds. - - If \a spec is Qt::TimeZone then the spec will be set to Qt::LocalTime, - i.e. the current system time zone. To create a Qt::TimeZone datetime - use the correct constructor. -*/ - -QDateTime::QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec, int offsetSeconds) - : d(QDateTimePrivate::create(date, time, spec, offsetSeconds)) -{ -} - -#if QT_CONFIG(timezone) -/*! - \since 5.2 - - Constructs a datetime with the given \a date and \a time, using - the Time Zone specified by \a timeZone. - - If \a date is valid and \a time is not, the time will be set to 00:00:00. - - If \a timeZone is invalid then the datetime will be invalid. -*/ - -QDateTime::QDateTime(const QDate &date, const QTime &time, const QTimeZone &timeZone) - : d(QDateTimePrivate::create(date, time, timeZone)) -{ -} -#endif // timezone - -/*! - Constructs a copy of the \a other datetime. -*/ -QDateTime::QDateTime(const QDateTime &other) noexcept - : d(other.d) -{ -} - -/*! - \since 5.8 - Moves the content of the temporary \a other datetime to this object and - leaves \a other in an unspecified (but proper) state. -*/ -QDateTime::QDateTime(QDateTime &&other) noexcept - : d(std::move(other.d)) -{ -} - -/*! - Destroys the datetime. -*/ -QDateTime::~QDateTime() -{ -} - -/*! - Makes a copy of the \a other datetime and returns a reference to the - copy. -*/ - -QDateTime &QDateTime::operator=(const QDateTime &other) noexcept -{ - d = other.d; - return *this; -} -/*! - \fn void QDateTime::swap(QDateTime &other) - \since 5.0 - - Swaps this datetime with \a other. This operation is very fast - and never fails. -*/ - -/*! - Returns \c true if both the date and the time are null; otherwise - returns \c false. A null datetime is invalid. - - \sa QDate::isNull(), QTime::isNull(), isValid() -*/ - -bool QDateTime::isNull() const -{ - auto status = getStatus(d); - return !status.testFlag(QDateTimePrivate::ValidDate) && - !status.testFlag(QDateTimePrivate::ValidTime); -} - -/*! - Returns \c true if both the date and the time are valid and they are valid in - the current Qt::TimeSpec, otherwise returns \c false. - - If the timeSpec() is Qt::LocalTime or Qt::TimeZone then the date and time are - checked to see if they fall in the Standard Time to Daylight-Saving Time transition - hour, i.e. if the transition is at 2am and the clock goes forward to 3am - then the time from 02:00:00 to 02:59:59.999 is considered to be invalid. - - \sa QDate::isValid(), QTime::isValid() -*/ - -bool QDateTime::isValid() const -{ - auto status = getStatus(d); - return status & QDateTimePrivate::ValidDateTime; -} - -/*! - Returns the date part of the datetime. - - \sa setDate(), time(), timeSpec() -*/ - -QDate QDateTime::date() const -{ - auto status = getStatus(d); - if (!status.testFlag(QDateTimePrivate::ValidDate)) - return QDate(); - QDate dt; - msecsToTime(getMSecs(d), &dt, 0); - return dt; -} - -/*! - Returns the time part of the datetime. - - \sa setTime(), date(), timeSpec() -*/ - -QTime QDateTime::time() const -{ - auto status = getStatus(d); - if (!status.testFlag(QDateTimePrivate::ValidTime)) - return QTime(); - QTime tm; - msecsToTime(getMSecs(d), 0, &tm); - return tm; -} - -/*! - Returns the time specification of the datetime. - - \sa setTimeSpec(), date(), time(), Qt::TimeSpec -*/ - -Qt::TimeSpec QDateTime::timeSpec() const -{ - return getSpec(d); -} - -#if QT_CONFIG(timezone) -/*! - \since 5.2 - - Returns the time zone of the datetime. - - If the timeSpec() is Qt::LocalTime then an instance of the current system - time zone will be returned. Note however that if you copy this time zone - the instance will not remain in sync if the system time zone changes. - - \sa setTimeZone(), Qt::TimeSpec -*/ - -QTimeZone QDateTime::timeZone() const -{ - switch (getSpec(d)) { - case Qt::UTC: - return QTimeZone::utc(); - case Qt::OffsetFromUTC: - return QTimeZone(d->m_offsetFromUtc); - case Qt::TimeZone: - Q_ASSERT(d->m_timeZone.isValid()); - return d->m_timeZone; - case Qt::LocalTime: - return QTimeZone::systemTimeZone(); - } - return QTimeZone(); -} -#endif // timezone - -/*! - \since 5.2 - - Returns the current Offset From UTC in seconds. - - If the timeSpec() is Qt::OffsetFromUTC this will be the value originally set. - - If the timeSpec() is Qt::TimeZone this will be the offset effective in the - Time Zone including any Daylight-Saving Offset. - - If the timeSpec() is Qt::LocalTime this will be the difference between the - Local Time and UTC including any Daylight-Saving Offset. - - If the timeSpec() is Qt::UTC this will be 0. - - \sa setOffsetFromUtc() -*/ - -int QDateTime::offsetFromUtc() const -{ - if (!d.isShort()) - return d->m_offsetFromUtc; - if (!isValid()) - return 0; - - auto spec = getSpec(d); - if (spec == Qt::LocalTime) { - // we didn't cache the value, so we need to calculate it now... - qint64 msecs = getMSecs(d); - return (msecs - toMSecsSinceEpoch()) / 1000; - } - - Q_ASSERT(spec == Qt::UTC); - return 0; -} - -/*! - \since 5.2 - - Returns the Time Zone Abbreviation for the datetime. - - If the timeSpec() is Qt::UTC this will be "UTC". - - If the timeSpec() is Qt::OffsetFromUTC this will be in the format - "UTC[+-]00:00". - - If the timeSpec() is Qt::LocalTime then the host system is queried for the - correct abbreviation. - - Note that abbreviations may or may not be localized. - - Note too that the abbreviation is not guaranteed to be a unique value, - i.e. different time zones may have the same abbreviation. - - \sa timeSpec() -*/ - -QString QDateTime::timeZoneAbbreviation() const -{ - switch (getSpec(d)) { - case Qt::UTC: - return QLatin1String("UTC"); - case Qt::OffsetFromUTC: - return QLatin1String("UTC") + toOffsetString(Qt::ISODate, d->m_offsetFromUtc); - case Qt::TimeZone: -#if !QT_CONFIG(timezone) - break; -#else - return d->m_timeZone.d->abbreviation(toMSecsSinceEpoch()); -#endif // timezone - case Qt::LocalTime: { - QString abbrev; - auto status = extractDaylightStatus(getStatus(d)); - localMSecsToEpochMSecs(getMSecs(d), &status, 0, 0, &abbrev); - return abbrev; - } - } - return QString(); -} - -/*! - \since 5.2 - - Returns if this datetime falls in Daylight-Saving Time. - - If the Qt::TimeSpec is not Qt::LocalTime or Qt::TimeZone then will always - return false. - - \sa timeSpec() -*/ - -bool QDateTime::isDaylightTime() const -{ - switch (getSpec(d)) { - case Qt::UTC: - case Qt::OffsetFromUTC: - return false; - case Qt::TimeZone: -#if !QT_CONFIG(timezone) - break; -#else - return d->m_timeZone.d->isDaylightTime(toMSecsSinceEpoch()); -#endif // timezone - case Qt::LocalTime: { - auto status = extractDaylightStatus(getStatus(d)); - if (status == QDateTimePrivate::UnknownDaylightTime) - localMSecsToEpochMSecs(getMSecs(d), &status); - return (status == QDateTimePrivate::DaylightTime); - } - } - return false; -} - -/*! - Sets the date part of this datetime to \a date. If no time is set yet, it - is set to midnight. If \a date is invalid, this QDateTime becomes invalid. - - \sa date(), setTime(), setTimeSpec() -*/ - -void QDateTime::setDate(const QDate &date) -{ - setDateTime(d, date, time()); -} - -/*! - Sets the time part of this datetime to \a time. If \a time is not valid, - this function sets it to midnight. Therefore, it's possible to clear any - set time in a QDateTime by setting it to a default QTime: - - \code - QDateTime dt = QDateTime::currentDateTime(); - dt.setTime(QTime()); - \endcode - - \sa time(), setDate(), setTimeSpec() -*/ - -void QDateTime::setTime(const QTime &time) -{ - setDateTime(d, date(), time); -} - -/*! - Sets the time specification used in this datetime to \a spec. - The datetime will refer to a different point in time. - - If \a spec is Qt::OffsetFromUTC then the timeSpec() will be set - to Qt::UTC, i.e. an effective offset of 0. - - If \a spec is Qt::TimeZone then the spec will be set to Qt::LocalTime, - i.e. the current system time zone. - - Example: - \snippet code/src_corelib_tools_qdatetime.cpp 19 - - \sa timeSpec(), setDate(), setTime(), setTimeZone(), Qt::TimeSpec -*/ - -void QDateTime::setTimeSpec(Qt::TimeSpec spec) -{ - QT_PREPEND_NAMESPACE(setTimeSpec(d, spec, 0)); - checkValidDateTime(d); -} - -/*! - \since 5.2 - - Sets the timeSpec() to Qt::OffsetFromUTC and the offset to \a offsetSeconds. - The datetime will refer to a different point in time. - - The maximum and minimum offset is 14 positive or negative hours. If - \a offsetSeconds is larger or smaller than that, then the result is - undefined. - - If \a offsetSeconds is 0 then the timeSpec() will be set to Qt::UTC. - - \sa isValid(), offsetFromUtc() -*/ - -void QDateTime::setOffsetFromUtc(int offsetSeconds) -{ - QT_PREPEND_NAMESPACE(setTimeSpec(d, Qt::OffsetFromUTC, offsetSeconds)); - checkValidDateTime(d); -} - -#if QT_CONFIG(timezone) -/*! - \since 5.2 - - Sets the time zone used in this datetime to \a toZone. - The datetime will refer to a different point in time. - - If \a toZone is invalid then the datetime will be invalid. - - \sa timeZone(), Qt::TimeSpec -*/ - -void QDateTime::setTimeZone(const QTimeZone &toZone) -{ - d.detach(); // always detach - d->m_status = mergeSpec(d->m_status, Qt::TimeZone); - d->m_offsetFromUtc = 0; - d->m_timeZone = toZone; - refreshDateTime(d); -} -#endif // timezone - -/*! - \since 4.7 - - Returns the datetime as the number of milliseconds that have passed - since 1970-01-01T00:00:00.000, Coordinated Universal Time (Qt::UTC). - - On systems that do not support time zones, this function will - behave as if local time were Qt::UTC. - - The behavior for this function is undefined if the datetime stored in - this object is not valid. However, for all valid dates, this function - returns a unique value. - - \sa toSecsSinceEpoch(), setMSecsSinceEpoch() -*/ -qint64 QDateTime::toMSecsSinceEpoch() const -{ - switch (getSpec(d)) { - case Qt::UTC: - return getMSecs(d); - - case Qt::OffsetFromUTC: - return d->m_msecs - (d->m_offsetFromUtc * 1000); - - case Qt::LocalTime: { - // recalculate the local timezone - auto status = extractDaylightStatus(getStatus(d)); - return localMSecsToEpochMSecs(getMSecs(d), &status); - } - - case Qt::TimeZone: -#if !QT_CONFIG(timezone) - return 0; -#else - return QDateTimePrivate::zoneMSecsToEpochMSecs(d->m_msecs, d->m_timeZone, - extractDaylightStatus(getStatus(d))); -#endif - } - Q_UNREACHABLE(); - return 0; -} - -/*! - \since 5.8 - - Returns the datetime as the number of seconds that have passed since - 1970-01-01T00:00:00.000, Coordinated Universal Time (Qt::UTC). - - On systems that do not support time zones, this function will - behave as if local time were Qt::UTC. - - The behavior for this function is undefined if the datetime stored in - this object is not valid. However, for all valid dates, this function - returns a unique value. - - \sa toMSecsSinceEpoch(), setSecsSinceEpoch() -*/ -qint64 QDateTime::toSecsSinceEpoch() const -{ - return toMSecsSinceEpoch() / 1000; -} - -#if QT_DEPRECATED_SINCE(5, 8) -/*! - \deprecated - - Returns the datetime as the number of seconds that have passed - since 1970-01-01T00:00:00, Coordinated Universal Time (Qt::UTC). - - On systems that do not support time zones, this function will - behave as if local time were Qt::UTC. - - \note This function returns a 32-bit unsigned integer and is deprecated. - - If the date is outside the range 1970-01-01T00:00:00 to - 2106-02-07T06:28:14, this function returns -1 cast to an unsigned integer - (i.e., 0xFFFFFFFF). - - To get an extended range, use toMSecsSinceEpoch() or toSecsSinceEpoch(). - - \sa toSecsSinceEpoch(), toMSecsSinceEpoch(), setTime_t() -*/ - -uint QDateTime::toTime_t() const -{ - if (!isValid()) - return uint(-1); - qint64 retval = toMSecsSinceEpoch() / 1000; - if (quint64(retval) >= Q_UINT64_C(0xFFFFFFFF)) - return uint(-1); - return uint(retval); -} -#endif - -/*! - \since 4.7 - - Sets the date and time given the number of milliseconds \a msecs that have - passed since 1970-01-01T00:00:00.000, Coordinated Universal Time - (Qt::UTC). On systems that do not support time zones this function - will behave as if local time were Qt::UTC. - - Note that passing the minimum of \c qint64 - (\c{std::numeric_limits::min()}) to \a msecs will result in - undefined behavior. - - \sa toMSecsSinceEpoch(), setSecsSinceEpoch() -*/ -void QDateTime::setMSecsSinceEpoch(qint64 msecs) -{ - const auto spec = getSpec(d); - auto status = getStatus(d); - - status &= ~QDateTimePrivate::ValidityMask; - switch (spec) { - case Qt::UTC: - status = status - | QDateTimePrivate::ValidDate - | QDateTimePrivate::ValidTime - | QDateTimePrivate::ValidDateTime; - break; - case Qt::OffsetFromUTC: - msecs = msecs + (d->m_offsetFromUtc * 1000); - status = status - | QDateTimePrivate::ValidDate - | QDateTimePrivate::ValidTime - | QDateTimePrivate::ValidDateTime; - break; - case Qt::TimeZone: - Q_ASSERT(!d.isShort()); -#if QT_CONFIG(timezone) - // Docs state any LocalTime before 1970-01-01 will *not* have any DST applied - // but all affected times afterwards will have DST applied. - d.detach(); - if (msecs >= 0) { - status = mergeDaylightStatus(status, - d->m_timeZone.d->isDaylightTime(msecs) - ? QDateTimePrivate::DaylightTime - : QDateTimePrivate::StandardTime); - d->m_offsetFromUtc = d->m_timeZone.d->offsetFromUtc(msecs); - } else { - status = mergeDaylightStatus(status, QDateTimePrivate::StandardTime); - d->m_offsetFromUtc = d->m_timeZone.d->standardTimeOffset(msecs); - } - msecs = msecs + (d->m_offsetFromUtc * 1000); - status = status - | QDateTimePrivate::ValidDate - | QDateTimePrivate::ValidTime - | QDateTimePrivate::ValidDateTime; -#endif // timezone - break; - case Qt::LocalTime: { - QDate dt; - QTime tm; - QDateTimePrivate::DaylightStatus dstStatus; - epochMSecsToLocalTime(msecs, &dt, &tm, &dstStatus); - setDateTime(d, dt, tm); - msecs = getMSecs(d); - status = mergeDaylightStatus(getStatus(d), dstStatus); - break; - } - } - - if (msecsCanBeSmall(msecs) && d.isShort()) { - // we can keep short - d.data.msecs = qintptr(msecs); - d.data.status = status; - } else { - d.detach(); - d->m_status = status & ~QDateTimePrivate::ShortData; - d->m_msecs = msecs; - } - - if (spec == Qt::LocalTime || spec == Qt::TimeZone) - refreshDateTime(d); -} - -/*! - \since 5.8 - - Sets the date and time given the number of seconds \a secs that have - passed since 1970-01-01T00:00:00.000, Coordinated Universal Time - (Qt::UTC). On systems that do not support time zones this function - will behave as if local time were Qt::UTC. - - \sa toSecsSinceEpoch(), setMSecsSinceEpoch() -*/ -void QDateTime::setSecsSinceEpoch(qint64 secs) -{ - setMSecsSinceEpoch(secs * 1000); -} - -#if QT_DEPRECATED_SINCE(5, 8) -/*! - \fn void QDateTime::setTime_t(uint seconds) - \deprecated - - Sets the date and time given the number of \a seconds that have - passed since 1970-01-01T00:00:00, Coordinated Universal Time - (Qt::UTC). On systems that do not support time zones this function - will behave as if local time were Qt::UTC. - - \note This function is deprecated. For new code, use setSecsSinceEpoch(). - - \sa toTime_t() -*/ - -void QDateTime::setTime_t(uint secsSince1Jan1970UTC) -{ - setMSecsSinceEpoch((qint64)secsSince1Jan1970UTC * 1000); -} -#endif - -#if QT_CONFIG(datestring) -/*! - \fn QString QDateTime::toString(Qt::DateFormat format) const - - \overload - - Returns the datetime as a string in the \a format given. - - If the \a format is Qt::TextDate, the string is formatted in - the default way. QDate::shortDayName(), QDate::shortMonthName(), - and QTime::toString() are used to generate the string, so the - day and month names will be localized names using the system locale, - i.e. QLocale::system(). An example of this formatting is - "Wed May 20 03:40:13 1998". - - If the \a format is Qt::ISODate, the string format corresponds - to the ISO 8601 extended specification for representations of - dates and times, taking the form yyyy-MM-ddTHH:mm:ss[Z|[+|-]HH:mm], - depending on the timeSpec() of the QDateTime. If the timeSpec() - is Qt::UTC, Z will be appended to the string; if the timeSpec() is - Qt::OffsetFromUTC, the offset in hours and minutes from UTC will - be appended to the string. To include milliseconds in the ISO 8601 - date, use the \a format Qt::ISODateWithMs, which corresponds to - yyyy-MM-ddTHH:mm:ss.zzz[Z|[+|-]HH:mm]. - - If the \a format is Qt::SystemLocaleShortDate or - Qt::SystemLocaleLongDate, the string format depends on the locale - settings of the system. Identical to calling - QLocale::system().toString(datetime, QLocale::ShortFormat) or - QLocale::system().toString(datetime, QLocale::LongFormat). - - If the \a format is Qt::DefaultLocaleShortDate or - Qt::DefaultLocaleLongDate, the string format depends on the - default application locale. This is the locale set with - QLocale::setDefault(), or the system locale if no default locale - has been set. Identical to calling QLocale().toString(datetime, - QLocale::ShortFormat) or QLocale().toString(datetime, - QLocale::LongFormat). - - If the \a format is Qt::RFC2822Date, the string is formatted - following \l{RFC 2822}. - - If the datetime is invalid, an empty string will be returned. - - \warning The Qt::ISODate format is only valid for years in the - range 0 to 9999. This restriction may apply to locale-aware - formats as well, depending on the locale settings. - - \sa fromString(), QDate::toString(), QTime::toString(), - QLocale::toString() -*/ - -QString QDateTime::toString(Qt::DateFormat format) const -{ - QString buf; - if (!isValid()) - return buf; - - switch (format) { - case Qt::SystemLocaleDate: - case Qt::SystemLocaleShortDate: - return QLocale::system().toString(*this, QLocale::ShortFormat); - case Qt::SystemLocaleLongDate: - return QLocale::system().toString(*this, QLocale::LongFormat); - case Qt::LocaleDate: - case Qt::DefaultLocaleShortDate: - return QLocale().toString(*this, QLocale::ShortFormat); - case Qt::DefaultLocaleLongDate: - return QLocale().toString(*this, QLocale::LongFormat); - case Qt::RFC2822Date: { - buf = QLocale::c().toString(*this, QStringViewLiteral("dd MMM yyyy hh:mm:ss ")); - buf += toOffsetString(Qt::TextDate, offsetFromUtc()); - return buf; - } - default: -#if QT_CONFIG(textdate) - case Qt::TextDate: { - const QPair p = getDateTime(d); - buf = p.first.toString(Qt::TextDate); - // Insert time between date's day and year: - buf.insert(buf.lastIndexOf(QLatin1Char(' ')), - QLatin1Char(' ') + p.second.toString(Qt::TextDate)); - // Append zone/offset indicator, as appropriate: - switch (timeSpec()) { - case Qt::LocalTime: - break; -# if QT_CONFIG(timezone) - case Qt::TimeZone: - buf += QLatin1Char(' ') + d->m_timeZone.abbreviation(*this); - break; -# endif - default: - buf += QLatin1String(" GMT"); - if (getSpec(d) == Qt::OffsetFromUTC) - buf += toOffsetString(Qt::TextDate, offsetFromUtc()); - } - return buf; - } -#endif - case Qt::ISODate: - case Qt::ISODateWithMs: { - const QPair p = getDateTime(d); - const QDate &dt = p.first; - const QTime &tm = p.second; - buf = dt.toString(Qt::ISODate); - if (buf.isEmpty()) - return QString(); // failed to convert - buf += QLatin1Char('T'); - buf += tm.toString(format); - switch (getSpec(d)) { - case Qt::UTC: - buf += QLatin1Char('Z'); - break; - case Qt::OffsetFromUTC: -#if QT_CONFIG(timezone) - case Qt::TimeZone: -#endif - buf += toOffsetString(Qt::ISODate, offsetFromUtc()); - break; - default: - break; - } - return buf; - } - } -} - -/*! - \fn QString QDateTime::toString(const QString &format) const - \fn QString QDateTime::toString(QStringView format) const - - Returns the datetime as a string. The \a format parameter - determines the format of the result string. - - These expressions may be used for the date: - - \table - \header \li Expression \li Output - \row \li d \li the day as number without a leading zero (1 to 31) - \row \li dd \li the day as number with a leading zero (01 to 31) - \row \li ddd - \li the abbreviated localized day name (e.g. 'Mon' to 'Sun'). - Uses the system locale to localize the name, i.e. QLocale::system(). - \row \li dddd - \li the long localized day name (e.g. 'Monday' to 'Sunday'). - Uses the system locale to localize the name, i.e. QLocale::system(). - \row \li M \li the month as number without a leading zero (1-12) - \row \li MM \li the month as number with a leading zero (01-12) - \row \li MMM - \li the abbreviated localized month name (e.g. 'Jan' to 'Dec'). - Uses the system locale to localize the name, i.e. QLocale::system(). - \row \li MMMM - \li the long localized month name (e.g. 'January' to 'December'). - Uses the system locale to localize the name, i.e. QLocale::system(). - \row \li yy \li the year as two digit number (00-99) - \row \li yyyy \li the year as four digit number - \endtable - - These expressions may be used for the time: - - \table - \header \li Expression \li Output - \row \li h - \li the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display) - \row \li hh - \li the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display) - \row \li H - \li the hour without a leading zero (0 to 23, even with AM/PM display) - \row \li HH - \li the hour with a leading zero (00 to 23, even with AM/PM display) - \row \li m \li the minute without a leading zero (0 to 59) - \row \li mm \li the minute with a leading zero (00 to 59) - \row \li s \li the whole second without a leading zero (0 to 59) - \row \li ss \li the whole second with a leading zero where applicable (00 to 59) - \row \li z \li the fractional part of the second, to go after a decimal - point, without trailing zeroes (0 to 999). Thus "\c{s.z}" - reports the seconds to full available (millisecond) precision - without trailing zeroes. - \row \li zzz \li the fractional part of the second, to millisecond - precision, including trailing zeroes where applicable (000 to 999). - \row \li AP or A - \li use AM/PM display. \e A/AP will be replaced by either "AM" or "PM". - \row \li ap or a - \li use am/pm display. \e a/ap will be replaced by either "am" or "pm". - \row \li t \li the timezone (for example "CEST") - \endtable - - Any sequence of characters enclosed in single quotes will be included - verbatim in the output string (stripped of the quotes), even if it contains - formatting characters. Two consecutive single quotes ("''") are replaced by - a single quote in the output. All other characters in the format string are - included verbatim in the output string. - - Formats without separators (e.g. "ddMM") are supported but must be used with - care, as the resulting strings aren't always reliably readable (e.g. if "dM" - produces "212" it could mean either the 2nd of December or the 21st of - February). - - Example format strings (assumed that the QDateTime is 21 May 2001 - 14:13:09.120): - - \table - \header \li Format \li Result - \row \li dd.MM.yyyy \li 21.05.2001 - \row \li ddd MMMM d yy \li Tue May 21 01 - \row \li hh:mm:ss.zzz \li 14:13:09.120 - \row \li hh:mm:ss.z \li 14:13:09.12 - \row \li h:m:s ap \li 2:13:9 pm - \endtable - - If the datetime is invalid, an empty string will be returned. - - \sa fromString(), QDate::toString(), QTime::toString(), QLocale::toString() -*/ -QString QDateTime::toString(QStringView format) const -{ - return QLocale::system().toString(*this, format); // QLocale::c() ### Qt6 -} - -#if QT_STRINGVIEW_LEVEL < 2 -QString QDateTime::toString(const QString &format) const -{ - return toString(qToStringViewIgnoringNull(format)); -} -#endif - -#endif // datestring - -static inline void massageAdjustedDateTime(const QDateTimeData &d, QDate *date, QTime *time) -{ - /* - If we have just adjusted to a day with a DST transition, our given time - may lie in the transition hour (either missing or duplicated). For any - other time, telling mktime (deep in the bowels of localMSecsToEpochMSecs) - we don't know its DST-ness will produce no adjustment (just a decision as - to its DST-ness); but for a time in spring's missing hour it'll adjust the - time while picking a DST-ness. (Handling of autumn is trickier, as either - DST-ness is valid, without adjusting the time. We might want to propagate - the daylight status in that case, but it's hard to do so without breaking - (far more common) other cases; and it makes little difference, as the two - answers do then differ only in DST-ness.) - */ - auto spec = getSpec(d); - if (spec == Qt::LocalTime) { - QDateTimePrivate::DaylightStatus status = QDateTimePrivate::UnknownDaylightTime; - localMSecsToEpochMSecs(timeToMSecs(*date, *time), &status, date, time); -#if QT_CONFIG(timezone) - } else if (spec == Qt::TimeZone) { - QDateTimePrivate::zoneMSecsToEpochMSecs(timeToMSecs(*date, *time), - d->m_timeZone, - QDateTimePrivate::UnknownDaylightTime, - date, time); -#endif // timezone - } -} - -/*! - Returns a QDateTime object containing a datetime \a ndays days - later than the datetime of this object (or earlier if \a ndays is - negative). - - If the timeSpec() is Qt::LocalTime and the resulting - date and time fall in the Standard Time to Daylight-Saving Time transition - hour then the result will be adjusted accordingly, i.e. if the transition - is at 2am and the clock goes forward to 3am and the result falls between - 2am and 3am then the result will be adjusted to fall after 3am. - - \sa daysTo(), addMonths(), addYears(), addSecs() -*/ - -QDateTime QDateTime::addDays(qint64 ndays) const -{ - QDateTime dt(*this); - QPair p = getDateTime(d); - QDate &date = p.first; - QTime &time = p.second; - date = date.addDays(ndays); - massageAdjustedDateTime(dt.d, &date, &time); - setDateTime(dt.d, date, time); - return dt; -} - -/*! - Returns a QDateTime object containing a datetime \a nmonths months - later than the datetime of this object (or earlier if \a nmonths - is negative). - - If the timeSpec() is Qt::LocalTime and the resulting - date and time fall in the Standard Time to Daylight-Saving Time transition - hour then the result will be adjusted accordingly, i.e. if the transition - is at 2am and the clock goes forward to 3am and the result falls between - 2am and 3am then the result will be adjusted to fall after 3am. - - \sa daysTo(), addDays(), addYears(), addSecs() -*/ - -QDateTime QDateTime::addMonths(int nmonths) const -{ - QDateTime dt(*this); - QPair p = getDateTime(d); - QDate &date = p.first; - QTime &time = p.second; - date = date.addMonths(nmonths); - massageAdjustedDateTime(dt.d, &date, &time); - setDateTime(dt.d, date, time); - return dt; -} - -/*! - Returns a QDateTime object containing a datetime \a nyears years - later than the datetime of this object (or earlier if \a nyears is - negative). - - If the timeSpec() is Qt::LocalTime and the resulting - date and time fall in the Standard Time to Daylight-Saving Time transition - hour then the result will be adjusted accordingly, i.e. if the transition - is at 2am and the clock goes forward to 3am and the result falls between - 2am and 3am then the result will be adjusted to fall after 3am. - - \sa daysTo(), addDays(), addMonths(), addSecs() -*/ - -QDateTime QDateTime::addYears(int nyears) const -{ - QDateTime dt(*this); - QPair p = getDateTime(d); - QDate &date = p.first; - QTime &time = p.second; - date = date.addYears(nyears); - massageAdjustedDateTime(dt.d, &date, &time); - setDateTime(dt.d, date, time); - return dt; -} - -/*! - Returns a QDateTime object containing a datetime \a s seconds - later than the datetime of this object (or earlier if \a s is - negative). - - If this datetime is invalid, an invalid datetime will be returned. - - \sa addMSecs(), secsTo(), addDays(), addMonths(), addYears() -*/ - -QDateTime QDateTime::addSecs(qint64 s) const -{ - return addMSecs(s * 1000); -} - -/*! - Returns a QDateTime object containing a datetime \a msecs miliseconds - later than the datetime of this object (or earlier if \a msecs is - negative). - - If this datetime is invalid, an invalid datetime will be returned. - - \sa addSecs(), msecsTo(), addDays(), addMonths(), addYears() -*/ -QDateTime QDateTime::addMSecs(qint64 msecs) const -{ - if (!isValid()) - return QDateTime(); - - QDateTime dt(*this); - auto spec = getSpec(d); - if (spec == Qt::LocalTime || spec == Qt::TimeZone) { - // Convert to real UTC first in case crosses DST transition - dt.setMSecsSinceEpoch(toMSecsSinceEpoch() + msecs); - } else { - // No need to convert, just add on - if (d.isShort()) { - // need to check if we need to enlarge first - msecs += dt.d.data.msecs; - if (msecsCanBeSmall(msecs)) { - dt.d.data.msecs = qintptr(msecs); - } else { - dt.d.detach(); - dt.d->m_msecs = msecs; - } - } else { - dt.d.detach(); - dt.d->m_msecs += msecs; - } - } - return dt; -} - -/*! - Returns the number of days from this datetime to the \a other - datetime. The number of days is counted as the number of times - midnight is reached between this datetime to the \a other - datetime. This means that a 10 minute difference from 23:55 to - 0:05 the next day counts as one day. - - If the \a other datetime is earlier than this datetime, - the value returned is negative. - - Example: - \snippet code/src_corelib_tools_qdatetime.cpp 15 - - \sa addDays(), secsTo(), msecsTo() -*/ - -qint64 QDateTime::daysTo(const QDateTime &other) const -{ - return date().daysTo(other.date()); -} - -/*! - Returns the number of seconds from this datetime to the \a other - datetime. If the \a other datetime is earlier than this datetime, - the value returned is negative. - - Before performing the comparison, the two datetimes are converted - to Qt::UTC to ensure that the result is correct if daylight-saving - (DST) applies to one of the two datetimes but not the other. - - Returns 0 if either datetime is invalid. - - Example: - \snippet code/src_corelib_tools_qdatetime.cpp 11 - - \sa addSecs(), daysTo(), QTime::secsTo() -*/ - -qint64 QDateTime::secsTo(const QDateTime &other) const -{ - return (msecsTo(other) / 1000); -} - -/*! - Returns the number of milliseconds from this datetime to the \a other - datetime. If the \a other datetime is earlier than this datetime, - the value returned is negative. - - Before performing the comparison, the two datetimes are converted - to Qt::UTC to ensure that the result is correct if daylight-saving - (DST) applies to one of the two datetimes and but not the other. - - Returns 0 if either datetime is invalid. - - \sa addMSecs(), daysTo(), QTime::msecsTo() -*/ - -qint64 QDateTime::msecsTo(const QDateTime &other) const -{ - if (!isValid() || !other.isValid()) - return 0; - - return other.toMSecsSinceEpoch() - toMSecsSinceEpoch(); -} - -/*! - \fn QDateTime QDateTime::toTimeSpec(Qt::TimeSpec spec) const - - Returns a copy of this datetime converted to the given time - \a spec. - - If \a spec is Qt::OffsetFromUTC then it is set to Qt::UTC. To set to a - spec of Qt::OffsetFromUTC use toOffsetFromUtc(). - - If \a spec is Qt::TimeZone then it is set to Qt::LocalTime, - i.e. the local Time Zone. - - Example: - \snippet code/src_corelib_tools_qdatetime.cpp 16 - - \sa timeSpec(), toTimeZone(), toUTC(), toLocalTime() -*/ - -QDateTime QDateTime::toTimeSpec(Qt::TimeSpec spec) const -{ - if (getSpec(d) == spec && (spec == Qt::UTC || spec == Qt::LocalTime)) - return *this; - - if (!isValid()) { - QDateTime ret = *this; - ret.setTimeSpec(spec); - return ret; - } - - return fromMSecsSinceEpoch(toMSecsSinceEpoch(), spec, 0); -} - -/*! - \since 5.2 - - \fn QDateTime QDateTime::toOffsetFromUtc(int offsetSeconds) const - - Returns a copy of this datetime converted to a spec of Qt::OffsetFromUTC - with the given \a offsetSeconds. - - If the \a offsetSeconds equals 0 then a UTC datetime will be returned - - \sa setOffsetFromUtc(), offsetFromUtc(), toTimeSpec() -*/ - -QDateTime QDateTime::toOffsetFromUtc(int offsetSeconds) const -{ - if (getSpec(d) == Qt::OffsetFromUTC - && d->m_offsetFromUtc == offsetSeconds) - return *this; - - if (!isValid()) { - QDateTime ret = *this; - ret.setOffsetFromUtc(offsetSeconds); - return ret; - } - - return fromMSecsSinceEpoch(toMSecsSinceEpoch(), Qt::OffsetFromUTC, offsetSeconds); -} - -#if QT_CONFIG(timezone) -/*! - \since 5.2 - - Returns a copy of this datetime converted to the given \a timeZone - - \sa timeZone(), toTimeSpec() -*/ - -QDateTime QDateTime::toTimeZone(const QTimeZone &timeZone) const -{ - if (getSpec(d) == Qt::TimeZone && d->m_timeZone == timeZone) - return *this; - - if (!isValid()) { - QDateTime ret = *this; - ret.setTimeZone(timeZone); - return ret; - } - - return fromMSecsSinceEpoch(toMSecsSinceEpoch(), timeZone); -} -#endif // timezone - -/*! - Returns \c true if this datetime is equal to the \a other datetime; - otherwise returns \c false. - - \sa operator!=() -*/ - -bool QDateTime::operator==(const QDateTime &other) const -{ - if (getSpec(d) == Qt::LocalTime - && getStatus(d) == getStatus(other.d)) { - return getMSecs(d) == getMSecs(other.d); - } - // Convert to UTC and compare - return (toMSecsSinceEpoch() == other.toMSecsSinceEpoch()); -} - -/*! - \fn bool QDateTime::operator!=(const QDateTime &other) const - - Returns \c true if this datetime is different from the \a other - datetime; otherwise returns \c false. - - Two datetimes are different if either the date, the time, or the - time zone components are different. - - \sa operator==() -*/ - -/*! - Returns \c true if this datetime is earlier than the \a other - datetime; otherwise returns \c false. -*/ - -bool QDateTime::operator<(const QDateTime &other) const -{ - if (getSpec(d) == Qt::LocalTime - && getStatus(d) == getStatus(other.d)) { - return getMSecs(d) < getMSecs(other.d); - } - // Convert to UTC and compare - return (toMSecsSinceEpoch() < other.toMSecsSinceEpoch()); -} - -/*! - \fn bool QDateTime::operator<=(const QDateTime &other) const - - Returns \c true if this datetime is earlier than or equal to the - \a other datetime; otherwise returns \c false. -*/ - -/*! - \fn bool QDateTime::operator>(const QDateTime &other) const - - Returns \c true if this datetime is later than the \a other datetime; - otherwise returns \c false. -*/ - -/*! - \fn bool QDateTime::operator>=(const QDateTime &other) const - - Returns \c true if this datetime is later than or equal to the - \a other datetime; otherwise returns \c false. -*/ - -/*! - \fn QDateTime QDateTime::currentDateTime() - Returns the current datetime, as reported by the system clock, in - the local time zone. - - \sa currentDateTimeUtc(), QDate::currentDate(), QTime::currentTime(), toTimeSpec() -*/ - -/*! - \fn QDateTime QDateTime::currentDateTimeUtc() - \since 4.7 - Returns the current datetime, as reported by the system clock, in - UTC. - - \sa currentDateTime(), QDate::currentDate(), QTime::currentTime(), toTimeSpec() -*/ - -/*! - \fn qint64 QDateTime::currentMSecsSinceEpoch() - \since 4.7 - - Returns the number of milliseconds since 1970-01-01T00:00:00 Universal - Coordinated Time. This number is like the POSIX time_t variable, but - expressed in milliseconds instead. - - \sa currentDateTime(), currentDateTimeUtc(), toTime_t(), toTimeSpec() -*/ - -/*! - \fn qint64 QDateTime::currentSecsSinceEpoch() - \since 5.8 - - Returns the number of seconds since 1970-01-01T00:00:00 Universal - Coordinated Time. - - \sa currentMSecsSinceEpoch() -*/ - -#if defined(Q_OS_WIN) -static inline uint msecsFromDecomposed(int hour, int minute, int sec, int msec = 0) -{ - return MSECS_PER_HOUR * hour + MSECS_PER_MIN * minute + 1000 * sec + msec; -} - -QDate QDate::currentDate() -{ - QDate d; - SYSTEMTIME st; - memset(&st, 0, sizeof(SYSTEMTIME)); - GetLocalTime(&st); - d.jd = julianDayFromDate(st.wYear, st.wMonth, st.wDay); - return d; -} - -QTime QTime::currentTime() -{ - QTime ct; - SYSTEMTIME st; - memset(&st, 0, sizeof(SYSTEMTIME)); - GetLocalTime(&st); - ct.setHMS(st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); - return ct; -} - -QDateTime QDateTime::currentDateTime() -{ - QDate d; - QTime t; - SYSTEMTIME st; - memset(&st, 0, sizeof(SYSTEMTIME)); - GetLocalTime(&st); - d.jd = julianDayFromDate(st.wYear, st.wMonth, st.wDay); - t.mds = msecsFromDecomposed(st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); - return QDateTime(d, t); -} - -QDateTime QDateTime::currentDateTimeUtc() -{ - QDate d; - QTime t; - SYSTEMTIME st; - memset(&st, 0, sizeof(SYSTEMTIME)); - GetSystemTime(&st); - d.jd = julianDayFromDate(st.wYear, st.wMonth, st.wDay); - t.mds = msecsFromDecomposed(st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); - return QDateTime(d, t, Qt::UTC); -} - -qint64 QDateTime::currentMSecsSinceEpoch() noexcept -{ - SYSTEMTIME st; - memset(&st, 0, sizeof(SYSTEMTIME)); - GetSystemTime(&st); - - return msecsFromDecomposed(st.wHour, st.wMinute, st.wSecond, st.wMilliseconds) + - qint64(julianDayFromDate(st.wYear, st.wMonth, st.wDay) - - julianDayFromDate(1970, 1, 1)) * Q_INT64_C(86400000); -} - -qint64 QDateTime::currentSecsSinceEpoch() noexcept -{ - SYSTEMTIME st; - memset(&st, 0, sizeof(SYSTEMTIME)); - GetSystemTime(&st); - - return st.wHour * SECS_PER_HOUR + st.wMinute * SECS_PER_MIN + st.wSecond + - qint64(julianDayFromDate(st.wYear, st.wMonth, st.wDay) - - julianDayFromDate(1970, 1, 1)) * Q_INT64_C(86400); -} - -#elif defined(Q_OS_UNIX) -QDate QDate::currentDate() -{ - return QDateTime::currentDateTime().date(); -} - -QTime QTime::currentTime() -{ - return QDateTime::currentDateTime().time(); -} - -QDateTime QDateTime::currentDateTime() -{ - return fromMSecsSinceEpoch(currentMSecsSinceEpoch(), Qt::LocalTime); -} - -QDateTime QDateTime::currentDateTimeUtc() -{ - return fromMSecsSinceEpoch(currentMSecsSinceEpoch(), Qt::UTC); -} - -qint64 QDateTime::currentMSecsSinceEpoch() noexcept -{ - // posix compliant system - // we have milliseconds - struct timeval tv; - gettimeofday(&tv, 0); - return qint64(tv.tv_sec) * Q_INT64_C(1000) + tv.tv_usec / 1000; -} - -qint64 QDateTime::currentSecsSinceEpoch() noexcept -{ - struct timeval tv; - gettimeofday(&tv, 0); - return qint64(tv.tv_sec); -} -#else -#error "What system is this?" -#endif - -#if QT_DEPRECATED_SINCE(5, 8) -/*! - \since 4.2 - \deprecated - - Returns a datetime whose date and time are the number of \a seconds - that have passed since 1970-01-01T00:00:00, Coordinated Universal - Time (Qt::UTC) and converted to Qt::LocalTime. On systems that do not - support time zones, the time will be set as if local time were Qt::UTC. - - \note This function is deprecated. Please use fromSecsSinceEpoch() in new - code. - - \sa toTime_t(), setTime_t() -*/ -QDateTime QDateTime::fromTime_t(uint seconds) -{ - return fromMSecsSinceEpoch((qint64)seconds * 1000, Qt::LocalTime); -} - -/*! - \since 5.2 - \deprecated - - Returns a datetime whose date and time are the number of \a seconds - that have passed since 1970-01-01T00:00:00, Coordinated Universal - Time (Qt::UTC) and converted to the given \a spec. - - If the \a spec is not Qt::OffsetFromUTC then the \a offsetSeconds will be - ignored. If the \a spec is Qt::OffsetFromUTC and the \a offsetSeconds is 0 - then the spec will be set to Qt::UTC, i.e. an offset of 0 seconds. - - \note This function is deprecated. Please use fromSecsSinceEpoch() in new - code. - - \sa toTime_t(), setTime_t() -*/ -QDateTime QDateTime::fromTime_t(uint seconds, Qt::TimeSpec spec, int offsetSeconds) -{ - return fromMSecsSinceEpoch((qint64)seconds * 1000, spec, offsetSeconds); -} - -#if QT_CONFIG(timezone) -/*! - \since 5.2 - \deprecated - - Returns a datetime whose date and time are the number of \a seconds - that have passed since 1970-01-01T00:00:00, Coordinated Universal - Time (Qt::UTC) and with the given \a timeZone. - - \note This function is deprecated. Please use fromSecsSinceEpoch() in new - code. - - \sa toTime_t(), setTime_t() -*/ -QDateTime QDateTime::fromTime_t(uint seconds, const QTimeZone &timeZone) -{ - return fromMSecsSinceEpoch((qint64)seconds * 1000, timeZone); -} -#endif -#endif // QT_DEPRECATED_SINCE(5, 8) - -/*! - \since 4.7 - - Returns a datetime whose date and time are the number of milliseconds, \a msecs, - that have passed since 1970-01-01T00:00:00.000, Coordinated Universal - Time (Qt::UTC), and converted to Qt::LocalTime. On systems that do not - support time zones, the time will be set as if local time were Qt::UTC. - - Note that there are possible values for \a msecs that lie outside the valid - range of QDateTime, both negative and positive. The behavior of this - function is undefined for those values. - - \sa toMSecsSinceEpoch(), setMSecsSinceEpoch() -*/ -QDateTime QDateTime::fromMSecsSinceEpoch(qint64 msecs) -{ - return fromMSecsSinceEpoch(msecs, Qt::LocalTime); -} - -/*! - \since 5.2 - - Returns a datetime whose date and time are the number of milliseconds \a msecs - that have passed since 1970-01-01T00:00:00.000, Coordinated Universal - Time (Qt::UTC) and converted to the given \a spec. - - Note that there are possible values for \a msecs that lie outside the valid - range of QDateTime, both negative and positive. The behavior of this - function is undefined for those values. - - If the \a spec is not Qt::OffsetFromUTC then the \a offsetSeconds will be - ignored. If the \a spec is Qt::OffsetFromUTC and the \a offsetSeconds is 0 - then the spec will be set to Qt::UTC, i.e. an offset of 0 seconds. - - If \a spec is Qt::TimeZone then the spec will be set to Qt::LocalTime, - i.e. the current system time zone. - - \sa toMSecsSinceEpoch(), setMSecsSinceEpoch() -*/ -QDateTime QDateTime::fromMSecsSinceEpoch(qint64 msecs, Qt::TimeSpec spec, int offsetSeconds) -{ - QDateTime dt; - QT_PREPEND_NAMESPACE(setTimeSpec(dt.d, spec, offsetSeconds)); - dt.setMSecsSinceEpoch(msecs); - return dt; -} - -/*! - \since 5.8 - - Returns a datetime whose date and time are the number of seconds \a secs - that have passed since 1970-01-01T00:00:00.000, Coordinated Universal - Time (Qt::UTC) and converted to the given \a spec. - - Note that there are possible values for \a secs that lie outside the valid - range of QDateTime, both negative and positive. The behavior of this - function is undefined for those values. - - If the \a spec is not Qt::OffsetFromUTC then the \a offsetSeconds will be - ignored. If the \a spec is Qt::OffsetFromUTC and the \a offsetSeconds is 0 - then the spec will be set to Qt::UTC, i.e. an offset of 0 seconds. - - If \a spec is Qt::TimeZone then the spec will be set to Qt::LocalTime, - i.e. the current system time zone. - - \sa toSecsSinceEpoch(), setSecsSinceEpoch() -*/ -QDateTime QDateTime::fromSecsSinceEpoch(qint64 secs, Qt::TimeSpec spec, int offsetSeconds) -{ - return fromMSecsSinceEpoch(secs * 1000, spec, offsetSeconds); -} - -#if QT_CONFIG(timezone) -/*! - \since 5.2 - - Returns a datetime whose date and time are the number of milliseconds \a msecs - that have passed since 1970-01-01T00:00:00.000, Coordinated Universal - Time (Qt::UTC) and with the given \a timeZone. - - \sa fromSecsSinceEpoch() -*/ -QDateTime QDateTime::fromMSecsSinceEpoch(qint64 msecs, const QTimeZone &timeZone) -{ - QDateTime dt; - dt.setTimeZone(timeZone); - dt.setMSecsSinceEpoch(msecs); - return dt; -} - -/*! - \since 5.8 - - Returns a datetime whose date and time are the number of seconds \a secs - that have passed since 1970-01-01T00:00:00.000, Coordinated Universal - Time (Qt::UTC) and with the given \a timeZone. - - \sa fromMSecsSinceEpoch() -*/ -QDateTime QDateTime::fromSecsSinceEpoch(qint64 secs, const QTimeZone &timeZone) -{ - return fromMSecsSinceEpoch(secs * 1000, timeZone); -} -#endif - -#if QT_DEPRECATED_SINCE(5, 2) -/*! - \since 4.4 - \internal - \obsolete - - This method was added in 4.4 but never documented as public. It was replaced - in 5.2 with public method setOffsetFromUtc() for consistency with QTimeZone. - - This method should never be made public. - - \sa setOffsetFromUtc() - */ -void QDateTime::setUtcOffset(int seconds) -{ - setOffsetFromUtc(seconds); -} - -/*! - \since 4.4 - \internal - \obsolete - - This method was added in 4.4 but never documented as public. It was replaced - in 5.1 with public method offsetFromUTC() for consistency with QTimeZone. - - This method should never be made public. - - \sa offsetFromUTC() -*/ -int QDateTime::utcOffset() const -{ - return offsetFromUtc(); -} -#endif // QT_DEPRECATED_SINCE - -#if QT_CONFIG(datestring) - -/*! - Returns the QDateTime represented by the \a string, using the - \a format given, or an invalid datetime if this is not possible. - - Note for Qt::TextDate: It is recommended that you use the - English short month names (e.g. "Jan"). Although localized month - names can also be used, they depend on the user's locale settings. - - \sa toString(), QLocale::toDateTime() -*/ -QDateTime QDateTime::fromString(const QString &string, Qt::DateFormat format) -{ - if (string.isEmpty()) - return QDateTime(); - - switch (format) { - case Qt::SystemLocaleDate: - case Qt::SystemLocaleShortDate: - return QLocale::system().toDateTime(string, QLocale::ShortFormat); - case Qt::SystemLocaleLongDate: - return QLocale::system().toDateTime(string, QLocale::LongFormat); - case Qt::LocaleDate: - case Qt::DefaultLocaleShortDate: - return QLocale().toDateTime(string, QLocale::ShortFormat); - case Qt::DefaultLocaleLongDate: - return QLocale().toDateTime(string, QLocale::LongFormat); - case Qt::RFC2822Date: { - const ParsedRfcDateTime rfc = rfcDateImpl(string); - - if (!rfc.date.isValid() || !rfc.time.isValid()) - return QDateTime(); - - QDateTime dateTime(rfc.date, rfc.time, Qt::UTC); - dateTime.setOffsetFromUtc(rfc.utcOffset); - return dateTime; - } - case Qt::ISODate: - case Qt::ISODateWithMs: { - const int size = string.size(); - if (size < 10) - return QDateTime(); - - QDate date = QDate::fromString(string.left(10), Qt::ISODate); - if (!date.isValid()) - return QDateTime(); - if (size == 10) - return QDateTime(date); - - Qt::TimeSpec spec = Qt::LocalTime; - QStringRef isoString(&string); - isoString = isoString.mid(10); // trim "yyyy-MM-dd" - - // Must be left with T and at least one digit for the hour: - if (isoString.size() < 2 - || !(isoString.startsWith(QLatin1Char('T')) - // FIXME: QSql relies on QVariant::toDateTime() accepting a space here: - || isoString.startsWith(QLatin1Char(' ')))) { - return QDateTime(); - } - isoString = isoString.mid(1); // trim 'T' (or space) - - int offset = 0; - // Check end of string for Time Zone definition, either Z for UTC or [+-]HH:mm for Offset - if (isoString.endsWith(QLatin1Char('Z'))) { - spec = Qt::UTC; - isoString.chop(1); // trim 'Z' - } else { - // the loop below is faster but functionally equal to: - // const int signIndex = isoString.indexOf(QRegExp(QStringLiteral("[+-]"))); - int signIndex = isoString.size() - 1; - Q_ASSERT(signIndex >= 0); - bool found = false; - { - const QChar plus = QLatin1Char('+'); - const QChar minus = QLatin1Char('-'); - do { - QChar character(isoString.at(signIndex)); - found = character == plus || character == minus; - } while (!found && --signIndex >= 0); - } - - if (found) { - bool ok; - offset = fromOffsetString(isoString.mid(signIndex), &ok); - if (!ok) - return QDateTime(); - isoString = isoString.left(signIndex); - spec = Qt::OffsetFromUTC; - } - } - - // Might be end of day (24:00, including variants), which QTime considers invalid. - // ISO 8601 (section 4.2.3) says that 24:00 is equivalent to 00:00 the next day. - bool isMidnight24 = false; - QTime time = fromIsoTimeString(isoString, format, &isMidnight24); - if (!time.isValid()) - return QDateTime(); - if (isMidnight24) - date = date.addDays(1); - return QDateTime(date, time, spec, offset); - } -#if QT_CONFIG(textdate) - case Qt::TextDate: { - QVector parts = string.splitRef(QLatin1Char(' '), QString::SkipEmptyParts); - - if ((parts.count() < 5) || (parts.count() > 6)) - return QDateTime(); - - // Accept "Sun Dec 1 13:02:00 1974" and "Sun 1. Dec 13:02:00 1974" - int month = 0; - int day = 0; - bool ok = false; - - // First try month then day - month = fromShortMonthName(parts.at(1)); - if (month) - day = parts.at(2).toInt(); - - // If failed try day then month - if (!month || !day) { - month = fromShortMonthName(parts.at(2)); - if (month) { - QStringRef dayStr = parts.at(1); - if (dayStr.endsWith(QLatin1Char('.'))) { - dayStr = dayStr.left(dayStr.size() - 1); - day = dayStr.toInt(); - } - } - } - - // If both failed, give up - if (!month || !day) - return QDateTime(); - - // Year can be before or after time, "Sun Dec 1 1974 13:02:00" or "Sun Dec 1 13:02:00 1974" - // Guess which by looking for ':' in the time - int year = 0; - int yearPart = 0; - int timePart = 0; - if (parts.at(3).contains(QLatin1Char(':'))) { - yearPart = 4; - timePart = 3; - } else if (parts.at(4).contains(QLatin1Char(':'))) { - yearPart = 3; - timePart = 4; - } else { - return QDateTime(); - } - - year = parts.at(yearPart).toInt(&ok); - if (!ok) - return QDateTime(); - - QDate date(year, month, day); - if (!date.isValid()) - return QDateTime(); - - QVector timeParts = parts.at(timePart).split(QLatin1Char(':')); - if (timeParts.count() < 2 || timeParts.count() > 3) - return QDateTime(); - - int hour = timeParts.at(0).toInt(&ok); - if (!ok) - return QDateTime(); - - int minute = timeParts.at(1).toInt(&ok); - if (!ok) - return QDateTime(); - - int second = 0; - int millisecond = 0; - if (timeParts.count() > 2) { - const QVector secondParts = timeParts.at(2).split(QLatin1Char('.')); - if (secondParts.size() > 2) { - return QDateTime(); - } - - second = secondParts.first().toInt(&ok); - if (!ok) { - return QDateTime(); - } - - if (secondParts.size() > 1) { - millisecond = secondParts.last().toInt(&ok); - if (!ok) { - return QDateTime(); - } - } - } - - QTime time(hour, minute, second, millisecond); - if (!time.isValid()) - return QDateTime(); - - if (parts.count() == 5) - return QDateTime(date, time, Qt::LocalTime); - - QStringRef tz = parts.at(5); - if (!tz.startsWith(QLatin1String("GMT"), Qt::CaseInsensitive)) - return QDateTime(); - tz = tz.mid(3); - if (!tz.isEmpty()) { - int offset = fromOffsetString(tz, &ok); - if (!ok) - return QDateTime(); - return QDateTime(date, time, Qt::OffsetFromUTC, offset); - } else { - return QDateTime(date, time, Qt::UTC); - } - } -#endif // textdate - } - - return QDateTime(); -} - -/*! - Returns the QDateTime represented by the \a string, using the \a - format given, or an invalid datetime if the string cannot be parsed. - - These expressions may be used for the date part of the format string: - - \table - \header \li Expression \li Output - \row \li d \li the day as number without a leading zero (1 to 31) - \row \li dd \li the day as number with a leading zero (01 to 31) - \row \li ddd - \li the abbreviated localized day name (e.g. 'Mon' to 'Sun'). - Uses QDate::shortDayName(). - \row \li dddd - \li the long localized day name (e.g. 'Monday' to 'Sunday'). - Uses QDate::longDayName(). - \row \li M \li the month as number without a leading zero (1-12) - \row \li MM \li the month as number with a leading zero (01-12) - \row \li MMM - \li the abbreviated localized month name (e.g. 'Jan' to 'Dec'). - Uses QDate::shortMonthName(). - \row \li MMMM - \li the long localized month name (e.g. 'January' to 'December'). - Uses QDate::longMonthName(). - \row \li yy \li the year as two digit number (00-99) - \row \li yyyy \li the year as four digit number - \endtable - - \note Unlike the other version of this function, day and month names must - be given in the user's local language. It is only possible to use the English - names if the user's language is English. - - These expressions may be used for the time part of the format string: - - \table - \header \li Expression \li Output - \row \li h - \li the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display) - \row \li hh - \li the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display) - \row \li H - \li the hour without a leading zero (0 to 23, even with AM/PM display) - \row \li HH - \li the hour with a leading zero (00 to 23, even with AM/PM display) - \row \li m \li the minute without a leading zero (0 to 59) - \row \li mm \li the minute with a leading zero (00 to 59) - \row \li s \li the whole second without a leading zero (0 to 59) - \row \li ss \li the whole second with a leading zero where applicable (00 to 59) - \row \li z \li the fractional part of the second, to go after a decimal - point, without trailing zeroes (0 to 999). Thus "\c{s.z}" - reports the seconds to full available (millisecond) precision - without trailing zeroes. - \row \li zzz \li the fractional part of the second, to millisecond - precision, including trailing zeroes where applicable (000 to 999). - \row \li AP or A - \li interpret as an AM/PM time. \e AP must be either "AM" or "PM". - \row \li ap or a - \li Interpret as an AM/PM time. \e ap must be either "am" or "pm". - \endtable - - All other input characters will be treated as text. Any sequence - of characters that are enclosed in single quotes will also be - treated as text and not be used as an expression. - - \snippet code/src_corelib_tools_qdatetime.cpp 12 - - If the format is not satisfied, an invalid QDateTime is returned. - The expressions that don't have leading zeroes (d, M, h, m, s, z) will be - greedy. This means that they will use two digits even if this will - put them outside the range and/or leave too few digits for other - sections. - - \snippet code/src_corelib_tools_qdatetime.cpp 13 - - This could have meant 1 January 00:30.00 but the M will grab - two digits. - - Incorrectly specified fields of the \a string will cause an invalid - QDateTime to be returned. For example, consider the following code, - where the two digit year 12 is read as 1912 (see the table below for all - field defaults); the resulting datetime is invalid because 23 April 1912 - was a Tuesday, not a Monday: - - \snippet code/src_corelib_tools_qdatetime.cpp 20 - - The correct code is: - - \snippet code/src_corelib_tools_qdatetime.cpp 21 - - For any field that is not represented in the format, the following - defaults are used: - - \table - \header \li Field \li Default value - \row \li Year \li 1900 - \row \li Month \li 1 (January) - \row \li Day \li 1 - \row \li Hour \li 0 - \row \li Minute \li 0 - \row \li Second \li 0 - \endtable - - For example: - - \snippet code/src_corelib_tools_qdatetime.cpp 14 - - \sa toString(), QDate::fromString(), QTime::fromString(), - QLocale::toDateTime() -*/ - -QDateTime QDateTime::fromString(const QString &string, const QString &format) -{ -#if QT_CONFIG(datetimeparser) - QTime time; - QDate date; - - QDateTimeParser dt(QVariant::DateTime, QDateTimeParser::FromString); - // dt.setDefaultLocale(QLocale::c()); ### Qt 6 - if (dt.parseFormat(format) && dt.fromString(string, &date, &time)) - return QDateTime(date, time); -#else - Q_UNUSED(string); - Q_UNUSED(format); -#endif - return QDateTime(); -} - -#endif // datestring -/*! - \fn QDateTime QDateTime::toLocalTime() const - - Returns a datetime containing the date and time information in - this datetime, but specified using the Qt::LocalTime definition. - - Example: - - \snippet code/src_corelib_tools_qdatetime.cpp 17 - - \sa toTimeSpec() -*/ - -/*! - \fn QDateTime QDateTime::toUTC() const - - Returns a datetime containing the date and time information in - this datetime, but specified using the Qt::UTC definition. - - Example: - - \snippet code/src_corelib_tools_qdatetime.cpp 18 - - \sa toTimeSpec() -*/ - -/***************************************************************************** - Date/time stream functions - *****************************************************************************/ - -#ifndef QT_NO_DATASTREAM -/*! - \relates QDate - - Writes the \a date to stream \a out. - - \sa {Serializing Qt Data Types} -*/ - -QDataStream &operator<<(QDataStream &out, const QDate &date) -{ - if (out.version() < QDataStream::Qt_5_0) - return out << quint32(date.jd); - else - return out << qint64(date.jd); -} - -/*! - \relates QDate - - Reads a date from stream \a in into the \a date. - - \sa {Serializing Qt Data Types} -*/ - -QDataStream &operator>>(QDataStream &in, QDate &date) -{ - if (in.version() < QDataStream::Qt_5_0) { - quint32 jd; - in >> jd; - // Older versions consider 0 an invalid jd. - date.jd = (jd != 0 ? jd : QDate::nullJd()); - } else { - qint64 jd; - in >> jd; - date.jd = jd; - } - - return in; -} - -/*! - \relates QTime - - Writes \a time to stream \a out. - - \sa {Serializing Qt Data Types} -*/ - -QDataStream &operator<<(QDataStream &out, const QTime &time) -{ - if (out.version() >= QDataStream::Qt_4_0) { - return out << quint32(time.mds); - } else { - // Qt3 had no support for reading -1, QTime() was valid and serialized as 0 - return out << quint32(time.isNull() ? 0 : time.mds); - } -} - -/*! - \relates QTime - - Reads a time from stream \a in into the given \a time. - - \sa {Serializing Qt Data Types} -*/ - -QDataStream &operator>>(QDataStream &in, QTime &time) -{ - quint32 ds; - in >> ds; - if (in.version() >= QDataStream::Qt_4_0) { - time.mds = int(ds); - } else { - // Qt3 would write 0 for a null time - time.mds = (ds == 0) ? QTime::NullTime : int(ds); - } - return in; -} - -/*! - \relates QDateTime - - Writes \a dateTime to the \a out stream. - - \sa {Serializing Qt Data Types} -*/ -QDataStream &operator<<(QDataStream &out, const QDateTime &dateTime) -{ - QPair dateAndTime; - - if (out.version() >= QDataStream::Qt_5_2) { - - // In 5.2 we switched to using Qt::TimeSpec and added offset support - dateAndTime = getDateTime(dateTime.d); - out << dateAndTime << qint8(dateTime.timeSpec()); - if (dateTime.timeSpec() == Qt::OffsetFromUTC) - out << qint32(dateTime.offsetFromUtc()); -#if QT_CONFIG(timezone) - else if (dateTime.timeSpec() == Qt::TimeZone) - out << dateTime.timeZone(); -#endif // timezone - - } else if (out.version() == QDataStream::Qt_5_0) { - - // In Qt 5.0 we incorrectly serialised all datetimes as UTC. - // This approach is wrong and should not be used again; it breaks - // the guarantee that a deserialised local datetime is the same time - // of day, regardless of which timezone it was serialised in. - dateAndTime = getDateTime((dateTime.isValid() ? dateTime.toUTC() : dateTime).d); - out << dateAndTime << qint8(dateTime.timeSpec()); - - } else if (out.version() >= QDataStream::Qt_4_0) { - - // From 4.0 to 5.1 (except 5.0) we used QDateTimePrivate::Spec - dateAndTime = getDateTime(dateTime.d); - out << dateAndTime; - switch (dateTime.timeSpec()) { - case Qt::UTC: - out << (qint8)QDateTimePrivate::UTC; - break; - case Qt::OffsetFromUTC: - out << (qint8)QDateTimePrivate::OffsetFromUTC; - break; - case Qt::TimeZone: - out << (qint8)QDateTimePrivate::TimeZone; - break; - case Qt::LocalTime: - out << (qint8)QDateTimePrivate::LocalUnknown; - break; - } - - } else { // version < QDataStream::Qt_4_0 - - // Before 4.0 there was no TimeSpec, only Qt::LocalTime was supported - dateAndTime = getDateTime(dateTime.d); - out << dateAndTime; - - } - - return out; -} - -/*! - \relates QDateTime - - Reads a datetime from the stream \a in into \a dateTime. - - \sa {Serializing Qt Data Types} -*/ - -QDataStream &operator>>(QDataStream &in, QDateTime &dateTime) -{ - QDate dt; - QTime tm; - qint8 ts = 0; - Qt::TimeSpec spec = Qt::LocalTime; - qint32 offset = 0; -#if QT_CONFIG(timezone) - QTimeZone tz; -#endif // timezone - - if (in.version() >= QDataStream::Qt_5_2) { - - // In 5.2 we switched to using Qt::TimeSpec and added offset support - in >> dt >> tm >> ts; - spec = static_cast(ts); - if (spec == Qt::OffsetFromUTC) { - in >> offset; - dateTime = QDateTime(dt, tm, spec, offset); -#if QT_CONFIG(timezone) - } else if (spec == Qt::TimeZone) { - in >> tz; - dateTime = QDateTime(dt, tm, tz); -#endif // timezone - } else { - dateTime = QDateTime(dt, tm, spec); - } - - } else if (in.version() == QDataStream::Qt_5_0) { - - // In Qt 5.0 we incorrectly serialised all datetimes as UTC - in >> dt >> tm >> ts; - spec = static_cast(ts); - dateTime = QDateTime(dt, tm, Qt::UTC); - dateTime = dateTime.toTimeSpec(spec); - - } else if (in.version() >= QDataStream::Qt_4_0) { - - // From 4.0 to 5.1 (except 5.0) we used QDateTimePrivate::Spec - in >> dt >> tm >> ts; - switch ((QDateTimePrivate::Spec)ts) { - case QDateTimePrivate::UTC: - spec = Qt::UTC; - break; - case QDateTimePrivate::OffsetFromUTC: - spec = Qt::OffsetFromUTC; - break; - case QDateTimePrivate::TimeZone: - spec = Qt::TimeZone; -#if QT_CONFIG(timezone) - // FIXME: need to use a different constructor ! -#endif - break; - case QDateTimePrivate::LocalUnknown: - case QDateTimePrivate::LocalStandard: - case QDateTimePrivate::LocalDST: - spec = Qt::LocalTime; - break; - } - dateTime = QDateTime(dt, tm, spec, offset); - - } else { // version < QDataStream::Qt_4_0 - - // Before 4.0 there was no TimeSpec, only Qt::LocalTime was supported - in >> dt >> tm; - dateTime = QDateTime(dt, tm, spec, offset); - - } - - return in; -} -#endif // QT_NO_DATASTREAM - -/***************************************************************************** - Date / Time Debug Streams -*****************************************************************************/ - -#if !defined(QT_NO_DEBUG_STREAM) && QT_CONFIG(datestring) -QDebug operator<<(QDebug dbg, const QDate &date) -{ - QDebugStateSaver saver(dbg); - dbg.nospace() << "QDate("; - if (date.isValid()) - dbg.nospace() << date.toString(Qt::ISODate); - else - dbg.nospace() << "Invalid"; - dbg.nospace() << ')'; - return dbg; -} - -QDebug operator<<(QDebug dbg, const QTime &time) -{ - QDebugStateSaver saver(dbg); - dbg.nospace() << "QTime("; - if (time.isValid()) - dbg.nospace() << time.toString(QStringViewLiteral("HH:mm:ss.zzz")); - else - dbg.nospace() << "Invalid"; - dbg.nospace() << ')'; - return dbg; -} - -QDebug operator<<(QDebug dbg, const QDateTime &date) -{ - QDebugStateSaver saver(dbg); - dbg.nospace() << "QDateTime("; - if (date.isValid()) { - const Qt::TimeSpec ts = date.timeSpec(); - dbg.noquote() << date.toString(QStringViewLiteral("yyyy-MM-dd HH:mm:ss.zzz t")) - << ' ' << ts; - switch (ts) { - case Qt::UTC: - break; - case Qt::OffsetFromUTC: - dbg.space() << date.offsetFromUtc() << 's'; - break; - case Qt::TimeZone: -#if QT_CONFIG(timezone) - dbg.space() << date.timeZone().id(); -#endif // timezone - break; - case Qt::LocalTime: - break; - } - } else { - dbg.nospace() << "Invalid"; - } - return dbg.nospace() << ')'; -} -#endif // debug_stream && datestring - -/*! \fn uint qHash(const QDateTime &key, uint seed = 0) - \relates QHash - \since 5.0 - - Returns the hash value for the \a key, using \a seed to seed the calculation. -*/ -uint qHash(const QDateTime &key, uint seed) -{ - // Use to toMSecsSinceEpoch instead of individual qHash functions for - // QDate/QTime/spec/offset because QDateTime::operator== converts both arguments - // to the same timezone. If we don't, qHash would return different hashes for - // two QDateTimes that are equivalent once converted to the same timezone. - return qHash(key.toMSecsSinceEpoch(), seed); -} - -/*! \fn uint qHash(const QDate &key, uint seed = 0) - \relates QHash - \since 5.0 - - Returns the hash value for the \a key, using \a seed to seed the calculation. -*/ -uint qHash(const QDate &key, uint seed) noexcept -{ - return qHash(key.toJulianDay(), seed); -} - -/*! \fn uint qHash(const QTime &key, uint seed = 0) - \relates QHash - \since 5.0 - - Returns the hash value for the \a key, using \a seed to seed the calculation. -*/ -uint qHash(const QTime &key, uint seed) noexcept -{ - return qHash(key.msecsSinceStartOfDay(), seed); -} - -QT_END_NAMESPACE diff --git a/src/corelib/tools/qdatetime.h b/src/corelib/tools/qdatetime.h deleted file mode 100644 index 3e3b953b52..0000000000 --- a/src/corelib/tools/qdatetime.h +++ /dev/null @@ -1,426 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2019 The Qt Company Ltd. -** Copyright (C) 2016 Intel Corporation. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QDATETIME_H -#define QDATETIME_H - -#include -#include -#include - -#include - -#if defined(Q_OS_DARWIN) || defined(Q_QDOC) -Q_FORWARD_DECLARE_CF_TYPE(CFDate); -Q_FORWARD_DECLARE_OBJC_CLASS(NSDate); -#endif - -QT_BEGIN_NAMESPACE - -class QTimeZone; -class QDateTime; - -class Q_CORE_EXPORT QDate -{ -public: - enum MonthNameType { // ### Qt 6: remove, along with methods using it - DateFormat = 0, - StandaloneFormat - }; -private: - explicit Q_DECL_CONSTEXPR QDate(qint64 julianDay) : jd(julianDay) {} -public: - Q_DECL_CONSTEXPR QDate() : jd(nullJd()) {} - QDate(int y, int m, int d); - - Q_DECL_CONSTEXPR bool isNull() const { return !isValid(); } - Q_DECL_CONSTEXPR bool isValid() const { return jd >= minJd() && jd <= maxJd(); } - - int year() const; - int month() const; - int day() const; - int dayOfWeek() const; - int dayOfYear() const; - int daysInMonth() const; - int daysInYear() const; - int weekNumber(int *yearNum = nullptr) const; - - QDateTime startOfDay(Qt::TimeSpec spec = Qt::LocalTime, int offsetSeconds = 0) const; - QDateTime endOfDay(Qt::TimeSpec spec = Qt::LocalTime, int offsetSeconds = 0) const; -#if QT_CONFIG(timezone) - QDateTime startOfDay(const QTimeZone &zone) const; - QDateTime endOfDay(const QTimeZone &zone) const; -#endif - -#if QT_DEPRECATED_SINCE(5, 10) && QT_CONFIG(textdate) - QT_DEPRECATED_X("Use QLocale::monthName or QLocale::standaloneMonthName") - static QString shortMonthName(int month, MonthNameType type = DateFormat); - QT_DEPRECATED_X("Use QLocale::dayName or QLocale::standaloneDayName") - static QString shortDayName(int weekday, MonthNameType type = DateFormat); - QT_DEPRECATED_X("Use QLocale::monthName or QLocale::standaloneMonthName") - static QString longMonthName(int month, MonthNameType type = DateFormat); - QT_DEPRECATED_X("Use QLocale::dayName or QLocale::standaloneDayName") - static QString longDayName(int weekday, MonthNameType type = DateFormat); -#endif // textdate && deprecated -#if QT_CONFIG(datestring) - QString toString(Qt::DateFormat f = Qt::TextDate) const; -#if QT_STRINGVIEW_LEVEL < 2 - QString toString(const QString &format) const; -#endif - QString toString(QStringView format) const; -#endif -#if QT_DEPRECATED_SINCE(5,0) - QT_DEPRECATED_X("Use setDate() instead") inline bool setYMD(int y, int m, int d) - { if (uint(y) <= 99) y += 1900; return setDate(y, m, d); } -#endif - - bool setDate(int year, int month, int day); - -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) - void getDate(int *year, int *month, int *day); // ### Qt 6: remove -#endif // < Qt 6 - void getDate(int *year, int *month, int *day) const; - - Q_REQUIRED_RESULT QDate addDays(qint64 days) const; - Q_REQUIRED_RESULT QDate addMonths(int months) const; - Q_REQUIRED_RESULT QDate addYears(int years) const; - qint64 daysTo(const QDate &) const; - - Q_DECL_CONSTEXPR bool operator==(const QDate &other) const { return jd == other.jd; } - Q_DECL_CONSTEXPR bool operator!=(const QDate &other) const { return jd != other.jd; } - Q_DECL_CONSTEXPR bool operator< (const QDate &other) const { return jd < other.jd; } - Q_DECL_CONSTEXPR bool operator<=(const QDate &other) const { return jd <= other.jd; } - Q_DECL_CONSTEXPR bool operator> (const QDate &other) const { return jd > other.jd; } - Q_DECL_CONSTEXPR bool operator>=(const QDate &other) const { return jd >= other.jd; } - - static QDate currentDate(); -#if QT_CONFIG(datestring) - static QDate fromString(const QString &s, Qt::DateFormat f = Qt::TextDate); - static QDate fromString(const QString &s, const QString &format); -#endif - static bool isValid(int y, int m, int d); - static bool isLeapYear(int year); - - static Q_DECL_CONSTEXPR inline QDate fromJulianDay(qint64 jd_) - { return jd_ >= minJd() && jd_ <= maxJd() ? QDate(jd_) : QDate() ; } - Q_DECL_CONSTEXPR inline qint64 toJulianDay() const { return jd; } - -private: - // using extra parentheses around min to avoid expanding it if it is a macro - static Q_DECL_CONSTEXPR inline qint64 nullJd() { return (std::numeric_limits::min)(); } - static Q_DECL_CONSTEXPR inline qint64 minJd() { return Q_INT64_C(-784350574879); } - static Q_DECL_CONSTEXPR inline qint64 maxJd() { return Q_INT64_C( 784354017364); } - - qint64 jd; - - friend class QDateTime; - friend class QDateTimePrivate; -#ifndef QT_NO_DATASTREAM - friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QDate &); - friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QDate &); -#endif -}; -Q_DECLARE_TYPEINFO(QDate, Q_MOVABLE_TYPE); - -class Q_CORE_EXPORT QTime -{ - explicit Q_DECL_CONSTEXPR QTime(int ms) : mds(ms) - {} -public: - Q_DECL_CONSTEXPR QTime(): mds(NullTime) - {} - QTime(int h, int m, int s = 0, int ms = 0); - - Q_DECL_CONSTEXPR bool isNull() const { return mds == NullTime; } - bool isValid() const; - - int hour() const; - int minute() const; - int second() const; - int msec() const; -#if QT_CONFIG(datestring) - QString toString(Qt::DateFormat f = Qt::TextDate) const; -#if QT_STRINGVIEW_LEVEL < 2 - QString toString(const QString &format) const; -#endif - QString toString(QStringView format) const; -#endif - bool setHMS(int h, int m, int s, int ms = 0); - - Q_REQUIRED_RESULT QTime addSecs(int secs) const; - int secsTo(const QTime &) const; - Q_REQUIRED_RESULT QTime addMSecs(int ms) const; - int msecsTo(const QTime &) const; - - Q_DECL_CONSTEXPR bool operator==(const QTime &other) const { return mds == other.mds; } - Q_DECL_CONSTEXPR bool operator!=(const QTime &other) const { return mds != other.mds; } - Q_DECL_CONSTEXPR bool operator< (const QTime &other) const { return mds < other.mds; } - Q_DECL_CONSTEXPR bool operator<=(const QTime &other) const { return mds <= other.mds; } - Q_DECL_CONSTEXPR bool operator> (const QTime &other) const { return mds > other.mds; } - Q_DECL_CONSTEXPR bool operator>=(const QTime &other) const { return mds >= other.mds; } - - static Q_DECL_CONSTEXPR inline QTime fromMSecsSinceStartOfDay(int msecs) { return QTime(msecs); } - Q_DECL_CONSTEXPR inline int msecsSinceStartOfDay() const { return mds == NullTime ? 0 : mds; } - - static QTime currentTime(); -#if QT_CONFIG(datestring) - static QTime fromString(const QString &s, Qt::DateFormat f = Qt::TextDate); - static QTime fromString(const QString &s, const QString &format); -#endif - static bool isValid(int h, int m, int s, int ms = 0); - -#if QT_DEPRECATED_SINCE(5, 14) // ### Qt 6: remove - QT_DEPRECATED_X("Use QElapsedTimer instead") void start(); - QT_DEPRECATED_X("Use QElapsedTimer instead") int restart(); - QT_DEPRECATED_X("Use QElapsedTimer instead") int elapsed() const; -#endif -private: - enum TimeFlag { NullTime = -1 }; - Q_DECL_CONSTEXPR inline int ds() const { return mds == -1 ? 0 : mds; } - int mds; - - friend class QDateTime; - friend class QDateTimePrivate; -#ifndef QT_NO_DATASTREAM - friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QTime &); - friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QTime &); -#endif -}; -Q_DECLARE_TYPEINFO(QTime, Q_MOVABLE_TYPE); - -class QDateTimePrivate; - -class Q_CORE_EXPORT QDateTime -{ - // ### Qt 6: revisit the optimization - struct ShortData { -#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN - quintptr status : 8; -#endif - // note: this is only 24 bits on 32-bit systems... - qintptr msecs : sizeof(void *) * 8 - 8; - -#if Q_BYTE_ORDER == Q_BIG_ENDIAN - quintptr status : 8; -#endif - }; - - union Data { - enum { - // To be of any use, we need at least 60 years around 1970, which - // is 1,893,456,000,000 ms. That requires 41 bits to store, plus - // the sign bit. With the status byte, the minimum size is 50 bits. - CanBeSmall = sizeof(ShortData) * 8 > 50 - }; - - Data(); - Data(Qt::TimeSpec); - Data(const Data &other); - Data(Data &&other); - Data &operator=(const Data &other); - ~Data(); - - bool isShort() const; - void detach(); - - const QDateTimePrivate *operator->() const; - QDateTimePrivate *operator->(); - - QDateTimePrivate *d; - ShortData data; - }; - -public: - QDateTime() noexcept(Data::CanBeSmall); - explicit QDateTime(const QDate &); - QDateTime(const QDate &, const QTime &, Qt::TimeSpec spec = Qt::LocalTime); - // ### Qt 6: Merge with above with default offsetSeconds = 0 - QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec, int offsetSeconds); -#if QT_CONFIG(timezone) - QDateTime(const QDate &date, const QTime &time, const QTimeZone &timeZone); -#endif // timezone - QDateTime(const QDateTime &other) noexcept; - QDateTime(QDateTime &&other) noexcept; - ~QDateTime(); - - QDateTime &operator=(QDateTime &&other) noexcept { swap(other); return *this; } - QDateTime &operator=(const QDateTime &other) noexcept; - - void swap(QDateTime &other) noexcept { qSwap(d.d, other.d.d); } - - bool isNull() const; - bool isValid() const; - - QDate date() const; - QTime time() const; - Qt::TimeSpec timeSpec() const; - int offsetFromUtc() const; -#if QT_CONFIG(timezone) - QTimeZone timeZone() const; -#endif // timezone - QString timeZoneAbbreviation() const; - bool isDaylightTime() const; - - qint64 toMSecsSinceEpoch() const; - qint64 toSecsSinceEpoch() const; - - void setDate(const QDate &date); - void setTime(const QTime &time); - void setTimeSpec(Qt::TimeSpec spec); - void setOffsetFromUtc(int offsetSeconds); -#if QT_CONFIG(timezone) - void setTimeZone(const QTimeZone &toZone); -#endif // timezone - void setMSecsSinceEpoch(qint64 msecs); - void setSecsSinceEpoch(qint64 secs); - -#if QT_CONFIG(datestring) - QString toString(Qt::DateFormat f = Qt::TextDate) const; -#if QT_STRINGVIEW_LEVEL < 2 - QString toString(const QString &format) const; -#endif - QString toString(QStringView format) const; -#endif - Q_REQUIRED_RESULT QDateTime addDays(qint64 days) const; - Q_REQUIRED_RESULT QDateTime addMonths(int months) const; - Q_REQUIRED_RESULT QDateTime addYears(int years) const; - Q_REQUIRED_RESULT QDateTime addSecs(qint64 secs) const; - Q_REQUIRED_RESULT QDateTime addMSecs(qint64 msecs) const; - - QDateTime toTimeSpec(Qt::TimeSpec spec) const; - inline QDateTime toLocalTime() const { return toTimeSpec(Qt::LocalTime); } - inline QDateTime toUTC() const { return toTimeSpec(Qt::UTC); } - QDateTime toOffsetFromUtc(int offsetSeconds) const; -#if QT_CONFIG(timezone) - QDateTime toTimeZone(const QTimeZone &toZone) const; -#endif // timezone - - qint64 daysTo(const QDateTime &) const; - qint64 secsTo(const QDateTime &) const; - qint64 msecsTo(const QDateTime &) const; - - bool operator==(const QDateTime &other) const; - inline bool operator!=(const QDateTime &other) const { return !(*this == other); } - bool operator<(const QDateTime &other) const; - inline bool operator<=(const QDateTime &other) const { return !(other < *this); } - inline bool operator>(const QDateTime &other) const { return other < *this; } - inline bool operator>=(const QDateTime &other) const { return !(*this < other); } - -#if QT_DEPRECATED_SINCE(5, 2) // ### Qt 6: remove - QT_DEPRECATED_X("Use setOffsetFromUtc() instead") void setUtcOffset(int seconds); - QT_DEPRECATED_X("Use offsetFromUtc() instead") int utcOffset() const; -#endif // QT_DEPRECATED_SINCE - - static QDateTime currentDateTime(); - static QDateTime currentDateTimeUtc(); -#if QT_CONFIG(datestring) - static QDateTime fromString(const QString &s, Qt::DateFormat f = Qt::TextDate); - static QDateTime fromString(const QString &s, const QString &format); -#endif - -#if QT_DEPRECATED_SINCE(5, 8) - uint toTime_t() const; - void setTime_t(uint secsSince1Jan1970UTC); - static QDateTime fromTime_t(uint secsSince1Jan1970UTC); - static QDateTime fromTime_t(uint secsSince1Jan1970UTC, Qt::TimeSpec spec, - int offsetFromUtc = 0); - static QDateTime fromTime_t(uint secsSince1Jan1970UTC, const QTimeZone &timeZone); -#endif - - static QDateTime fromMSecsSinceEpoch(qint64 msecs); - // ### Qt 6: Merge with above with default spec = Qt::LocalTime - static QDateTime fromMSecsSinceEpoch(qint64 msecs, Qt::TimeSpec spec, int offsetFromUtc = 0); - static QDateTime fromSecsSinceEpoch(qint64 secs, Qt::TimeSpec spe = Qt::LocalTime, int offsetFromUtc = 0); - -#if QT_CONFIG(timezone) - static QDateTime fromMSecsSinceEpoch(qint64 msecs, const QTimeZone &timeZone); - static QDateTime fromSecsSinceEpoch(qint64 secs, const QTimeZone &timeZone); -#endif - - static qint64 currentMSecsSinceEpoch() noexcept; - static qint64 currentSecsSinceEpoch() noexcept; - -#if defined(Q_OS_DARWIN) || defined(Q_QDOC) - static QDateTime fromCFDate(CFDateRef date); - CFDateRef toCFDate() const Q_DECL_CF_RETURNS_RETAINED; - static QDateTime fromNSDate(const NSDate *date); - NSDate *toNSDate() const Q_DECL_NS_RETURNS_AUTORELEASED; -#endif - -private: - friend class QDateTimePrivate; - - Data d; - -#ifndef QT_NO_DATASTREAM - friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QDateTime &); - friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QDateTime &); -#endif - -#if !defined(QT_NO_DEBUG_STREAM) && QT_CONFIG(datestring) - friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QDateTime &); -#endif -}; -Q_DECLARE_SHARED(QDateTime) - -#ifndef QT_NO_DATASTREAM -Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QDate &); -Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QDate &); -Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QTime &); -Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QTime &); -Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QDateTime &); -Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QDateTime &); -#endif // QT_NO_DATASTREAM - -#if !defined(QT_NO_DEBUG_STREAM) && QT_CONFIG(datestring) -Q_CORE_EXPORT QDebug operator<<(QDebug, const QDate &); -Q_CORE_EXPORT QDebug operator<<(QDebug, const QTime &); -Q_CORE_EXPORT QDebug operator<<(QDebug, const QDateTime &); -#endif - -// QDateTime is not noexcept for now -- to be revised once -// timezone and calendaring support is added -Q_CORE_EXPORT uint qHash(const QDateTime &key, uint seed = 0); -Q_CORE_EXPORT uint qHash(const QDate &key, uint seed = 0) noexcept; -Q_CORE_EXPORT uint qHash(const QTime &key, uint seed = 0) noexcept; - -QT_END_NAMESPACE - -#endif // QDATETIME_H diff --git a/src/corelib/tools/qdatetime_p.h b/src/corelib/tools/qdatetime_p.h deleted file mode 100644 index 6018f8f7b0..0000000000 --- a/src/corelib/tools/qdatetime_p.h +++ /dev/null @@ -1,151 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Copyright (C) 2016 Intel Corporation. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QDATETIME_P_H -#define QDATETIME_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include -#include "qplatformdefs.h" -#include "QtCore/qatomic.h" -#include "QtCore/qdatetime.h" -#include "QtCore/qpair.h" - -#if QT_CONFIG(timezone) -#include "qtimezone.h" -#endif - -QT_BEGIN_NAMESPACE - -class QDateTimePrivate -{ -public: - // forward the declarations from QDateTime (this makes them public) - typedef QDateTime::ShortData QDateTimeShortData; - typedef QDateTime::Data QDateTimeData; - - // Never change or delete this enum, it is required for backwards compatible - // serialization of QDateTime before 5.2, so is essentially public API - enum Spec { - LocalUnknown = -1, - LocalStandard = 0, - LocalDST = 1, - UTC = 2, - OffsetFromUTC = 3, - TimeZone = 4 - }; - - // Daylight Time Status - enum DaylightStatus { - UnknownDaylightTime = -1, - StandardTime = 0, - DaylightTime = 1 - }; - - // Status of date/time - enum StatusFlag { - ShortData = 0x01, - - ValidDate = 0x02, - ValidTime = 0x04, - ValidDateTime = 0x08, - - TimeSpecMask = 0x30, - - SetToStandardTime = 0x40, - SetToDaylightTime = 0x80 - }; - Q_DECLARE_FLAGS(StatusFlags, StatusFlag) - - enum { - TimeSpecShift = 4, - ValidityMask = ValidDate | ValidTime | ValidDateTime, - DaylightMask = SetToStandardTime | SetToDaylightTime - }; - - QDateTimePrivate() : m_msecs(0), - m_status(StatusFlag(Qt::LocalTime << TimeSpecShift)), - m_offsetFromUtc(0), - ref(0) - { - } - - static QDateTime::Data create(const QDate &toDate, const QTime &toTime, Qt::TimeSpec toSpec, - int offsetSeconds); - -#if QT_CONFIG(timezone) - static QDateTime::Data create(const QDate &toDate, const QTime &toTime, const QTimeZone & timeZone); -#endif // timezone - - qint64 m_msecs; - StatusFlags m_status; - int m_offsetFromUtc; - mutable QAtomicInt ref; -#if QT_CONFIG(timezone) - QTimeZone m_timeZone; -#endif // timezone - -#if QT_CONFIG(timezone) - static qint64 zoneMSecsToEpochMSecs(qint64 msecs, const QTimeZone &zone, - DaylightStatus hint = UnknownDaylightTime, - QDate *localDate = nullptr, QTime *localTime = nullptr); - - // Inlined for its one caller in qdatetime.cpp - inline void setUtcOffsetByTZ(qint64 atMSecsSinceEpoch); -#endif // timezone - - // ### Qt 5.14: expose publicly in QDateTime - // The first and last years of which QDateTime can represent some part: - enum class YearRange : qint32 { First = -292275056, Last = +292278994 }; -}; - -QT_END_NAMESPACE - -#endif // QDATETIME_P_H diff --git a/src/corelib/tools/qdatetimeparser.cpp b/src/corelib/tools/qdatetimeparser.cpp deleted file mode 100644 index 728b066db1..0000000000 --- a/src/corelib/tools/qdatetimeparser.cpp +++ /dev/null @@ -1,2047 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qplatformdefs.h" -#include "private/qdatetimeparser_p.h" - -#include "qdatastream.h" -#include "qset.h" -#include "qlocale.h" -#include "qdatetime.h" -#if QT_CONFIG(timezone) -#include "qtimezone.h" -#endif -#include "qdebug.h" - -//#define QDATETIMEPARSER_DEBUG -#if defined (QDATETIMEPARSER_DEBUG) && !defined(QT_NO_DEBUG_STREAM) -# define QDTPDEBUG qDebug() -# define QDTPDEBUGN qDebug -#else -# define QDTPDEBUG if (false) qDebug() -# define QDTPDEBUGN if (false) qDebug -#endif - -QT_BEGIN_NAMESPACE - -QDateTimeParser::~QDateTimeParser() -{ -} - -/*! - \internal - Gets the digit from a datetime. E.g. - - QDateTime var(QDate(2004, 02, 02)); - int digit = getDigit(var, Year); - // digit = 2004 -*/ - -int QDateTimeParser::getDigit(const QDateTime &t, int index) const -{ - if (index < 0 || index >= sectionNodes.size()) { -#if QT_CONFIG(datestring) - qWarning("QDateTimeParser::getDigit() Internal error (%ls %d)", - qUtf16Printable(t.toString()), index); -#else - qWarning("QDateTimeParser::getDigit() Internal error (%d)", index); -#endif - return -1; - } - const SectionNode &node = sectionNodes.at(index); - switch (node.type) { - case TimeZoneSection: return t.offsetFromUtc(); - case Hour24Section: case Hour12Section: return t.time().hour(); - case MinuteSection: return t.time().minute(); - case SecondSection: return t.time().second(); - case MSecSection: return t.time().msec(); - case YearSection2Digits: - case YearSection: return t.date().year(); - case MonthSection: return t.date().month(); - case DaySection: return t.date().day(); - case DayOfWeekSectionShort: - case DayOfWeekSectionLong: return t.date().day(); - case AmPmSection: return t.time().hour() > 11 ? 1 : 0; - - default: break; - } - -#if QT_CONFIG(datestring) - qWarning("QDateTimeParser::getDigit() Internal error 2 (%ls %d)", - qUtf16Printable(t.toString()), index); -#else - qWarning("QDateTimeParser::getDigit() Internal error 2 (%d)", index); -#endif - return -1; -} - -/*! - \internal - Sets a digit in a datetime. E.g. - - QDateTime var(QDate(2004, 02, 02)); - int digit = getDigit(var, Year); - // digit = 2004 - setDigit(&var, Year, 2005); - digit = getDigit(var, Year); - // digit = 2005 -*/ - -bool QDateTimeParser::setDigit(QDateTime &v, int index, int newVal) const -{ - if (index < 0 || index >= sectionNodes.size()) { -#if QT_CONFIG(datestring) - qWarning("QDateTimeParser::setDigit() Internal error (%ls %d %d)", - qUtf16Printable(v.toString()), index, newVal); -#else - qWarning("QDateTimeParser::setDigit() Internal error (%d %d)", index, newVal); -#endif - return false; - } - const SectionNode &node = sectionNodes.at(index); - - const QDate date = v.date(); - const QTime time = v.time(); - int year = date.year(); - int month = date.month(); - int day = date.day(); - int hour = time.hour(); - int minute = time.minute(); - int second = time.second(); - int msec = time.msec(); - Qt::TimeSpec tspec = v.timeSpec(); - // Only offset from UTC is amenable to setting an int value: - int offset = tspec == Qt::OffsetFromUTC ? v.offsetFromUtc() : 0; - - switch (node.type) { - case Hour24Section: case Hour12Section: hour = newVal; break; - case MinuteSection: minute = newVal; break; - case SecondSection: second = newVal; break; - case MSecSection: msec = newVal; break; - case YearSection2Digits: - case YearSection: year = newVal; break; - case MonthSection: month = newVal; break; - case DaySection: - case DayOfWeekSectionShort: - case DayOfWeekSectionLong: - if (newVal > 31) { - // have to keep legacy behavior. setting the - // date to 32 should return false. Setting it - // to 31 for february should return true - return false; - } - day = newVal; - break; - case TimeZoneSection: - if (newVal < absoluteMin(index) || newVal > absoluteMax(index)) - return false; - tspec = Qt::OffsetFromUTC; - offset = newVal; - break; - case AmPmSection: hour = (newVal == 0 ? hour % 12 : (hour % 12) + 12); break; - default: - qWarning("QDateTimeParser::setDigit() Internal error (%ls)", - qUtf16Printable(node.name())); - break; - } - - if (!(node.type & DaySectionMask)) { - if (day < cachedDay) - day = cachedDay; - const int max = QDate(year, month, 1).daysInMonth(); - if (day > max) { - day = max; - } - } - - const QDate newDate(year, month, day); - const QTime newTime(hour, minute, second, msec); - if (!newDate.isValid() || !newTime.isValid()) - return false; - - // Preserve zone: - v = -#if QT_CONFIG(timezone) - tspec == Qt::TimeZone ? QDateTime(newDate, newTime, v.timeZone()) : -#endif - QDateTime(newDate, newTime, tspec, offset); - return true; -} - - - -/*! - \internal - - Returns the absolute maximum for a section -*/ - -int QDateTimeParser::absoluteMax(int s, const QDateTime &cur) const -{ - const SectionNode &sn = sectionNode(s); - switch (sn.type) { -#if QT_CONFIG(timezone) - case TimeZoneSection: return QTimeZone::MaxUtcOffsetSecs; -#endif - case Hour24Section: - case Hour12Section: return 23; // this is special-cased in - // parseSection. We want it to be - // 23 for the stepBy case. - case MinuteSection: - case SecondSection: return 59; - case MSecSection: return 999; - case YearSection2Digits: - case YearSection: return 9999; // sectionMaxSize will prevent - // people from typing in a larger - // number in count == 2 sections. - // stepBy() will work on real years anyway - case MonthSection: return 12; - case DaySection: - case DayOfWeekSectionShort: - case DayOfWeekSectionLong: return cur.isValid() ? cur.date().daysInMonth() : 31; - case AmPmSection: return 1; - default: break; - } - qWarning("QDateTimeParser::absoluteMax() Internal error (%ls)", - qUtf16Printable(sn.name())); - return -1; -} - -/*! - \internal - - Returns the absolute minimum for a section -*/ - -int QDateTimeParser::absoluteMin(int s) const -{ - const SectionNode &sn = sectionNode(s); - switch (sn.type) { -#if QT_CONFIG(timezone) - case TimeZoneSection: return QTimeZone::MinUtcOffsetSecs; -#endif - case Hour24Section: - case Hour12Section: - case MinuteSection: - case SecondSection: - case MSecSection: - case YearSection2Digits: - case YearSection: return 0; - case MonthSection: - case DaySection: - case DayOfWeekSectionShort: - case DayOfWeekSectionLong: return 1; - case AmPmSection: return 0; - default: break; - } - qWarning("QDateTimeParser::absoluteMin() Internal error (%ls, %0x)", - qUtf16Printable(sn.name()), sn.type); - return -1; -} - -/*! - \internal - - Returns the sectionNode for the Section \a s. -*/ - -const QDateTimeParser::SectionNode &QDateTimeParser::sectionNode(int sectionIndex) const -{ - if (sectionIndex < 0) { - switch (sectionIndex) { - case FirstSectionIndex: - return first; - case LastSectionIndex: - return last; - case NoSectionIndex: - return none; - } - } else if (sectionIndex < sectionNodes.size()) { - return sectionNodes.at(sectionIndex); - } - - qWarning("QDateTimeParser::sectionNode() Internal error (%d)", - sectionIndex); - return none; -} - -QDateTimeParser::Section QDateTimeParser::sectionType(int sectionIndex) const -{ - return sectionNode(sectionIndex).type; -} - - -/*! - \internal - - Returns the starting position for section \a s. -*/ - -int QDateTimeParser::sectionPos(int sectionIndex) const -{ - return sectionPos(sectionNode(sectionIndex)); -} - -int QDateTimeParser::sectionPos(const SectionNode &sn) const -{ - switch (sn.type) { - case FirstSection: return 0; - case LastSection: return displayText().size() - 1; - default: break; - } - if (sn.pos == -1) { - qWarning("QDateTimeParser::sectionPos Internal error (%ls)", qUtf16Printable(sn.name())); - return -1; - } - return sn.pos; -} - - -/*! - \internal - - helper function for parseFormat. removes quotes that are - not escaped and removes the escaping on those that are escaped - -*/ - -static QString unquote(const QStringRef &str) -{ - const QChar quote(QLatin1Char('\'')); - const QChar slash(QLatin1Char('\\')); - const QChar zero(QLatin1Char('0')); - QString ret; - QChar status(zero); - const int max = str.size(); - for (int i=0; iappend(lastQuote >= from ? unquote(separator) : separator.toString()); -} - - -bool QDateTimeParser::parseFormat(const QString &newFormat) -{ - const QLatin1Char quote('\''); - const QLatin1Char slash('\\'); - const QLatin1Char zero('0'); - if (newFormat == displayFormat && !newFormat.isEmpty()) { - return true; - } - - QDTPDEBUGN("parseFormat: %s", newFormat.toLatin1().constData()); - - QVector newSectionNodes; - Sections newDisplay = 0; - QStringList newSeparators; - int i, index = 0; - int add = 0; - QChar status(zero); - const int max = newFormat.size(); - int lastQuote = -1; - for (i = 0; i 0 && newFormat.at(i - 1) != slash) { - status = zero; - } - } else if (status != quote) { - const char sect = newFormat.at(i).toLatin1(); - switch (sect) { - case 'H': - case 'h': - if (parserType != QVariant::Date) { - const Section hour = (sect == 'h') ? Hour12Section : Hour24Section; - const SectionNode sn = { hour, i - add, countRepeat(newFormat, i, 2), 0 }; - newSectionNodes.append(sn); - appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote); - i += sn.count - 1; - index = i + 1; - newDisplay |= hour; - } - break; - case 'm': - if (parserType != QVariant::Date) { - const SectionNode sn = { MinuteSection, i - add, countRepeat(newFormat, i, 2), 0 }; - newSectionNodes.append(sn); - appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote); - i += sn.count - 1; - index = i + 1; - newDisplay |= MinuteSection; - } - break; - case 's': - if (parserType != QVariant::Date) { - const SectionNode sn = { SecondSection, i - add, countRepeat(newFormat, i, 2), 0 }; - newSectionNodes.append(sn); - appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote); - i += sn.count - 1; - index = i + 1; - newDisplay |= SecondSection; - } - break; - - case 'z': - if (parserType != QVariant::Date) { - const SectionNode sn = { MSecSection, i - add, countRepeat(newFormat, i, 3) < 3 ? 1 : 3, 0 }; - newSectionNodes.append(sn); - appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote); - i += sn.count - 1; - index = i + 1; - newDisplay |= MSecSection; - } - break; - case 'A': - case 'a': - if (parserType != QVariant::Date) { - const bool cap = (sect == 'A'); - const SectionNode sn = { AmPmSection, i - add, (cap ? 1 : 0), 0 }; - newSectionNodes.append(sn); - appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote); - newDisplay |= AmPmSection; - if (i + 1 < newFormat.size() - && newFormat.at(i+1) == (cap ? QLatin1Char('P') : QLatin1Char('p'))) { - ++i; - } - index = i + 1; - } - break; - case 'y': - if (parserType != QVariant::Time) { - const int repeat = countRepeat(newFormat, i, 4); - if (repeat >= 2) { - const SectionNode sn = { repeat == 4 ? YearSection : YearSection2Digits, - i - add, repeat == 4 ? 4 : 2, 0 }; - newSectionNodes.append(sn); - appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote); - i += sn.count - 1; - index = i + 1; - newDisplay |= sn.type; - } - } - break; - case 'M': - if (parserType != QVariant::Time) { - const SectionNode sn = { MonthSection, i - add, countRepeat(newFormat, i, 4), 0 }; - newSectionNodes.append(sn); - newSeparators.append(unquote(newFormat.midRef(index, i - index))); - i += sn.count - 1; - index = i + 1; - newDisplay |= MonthSection; - } - break; - case 'd': - if (parserType != QVariant::Time) { - const int repeat = countRepeat(newFormat, i, 4); - const Section sectionType = (repeat == 4 ? DayOfWeekSectionLong - : (repeat == 3 ? DayOfWeekSectionShort : DaySection)); - const SectionNode sn = { sectionType, i - add, repeat, 0 }; - newSectionNodes.append(sn); - appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote); - i += sn.count - 1; - index = i + 1; - newDisplay |= sn.type; - } - break; - case 't': - if (parserType != QVariant::Time) { - const SectionNode sn = { TimeZoneSection, i - add, countRepeat(newFormat, i, 4), 0 }; - newSectionNodes.append(sn); - appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote); - i += sn.count - 1; - index = i + 1; - newDisplay |= TimeZoneSection; - } - break; - default: - break; - } - } - } - if (newSectionNodes.isEmpty() && context == DateTimeEdit) { - return false; - } - - if ((newDisplay & (AmPmSection|Hour12Section)) == Hour12Section) { - const int count = newSectionNodes.size(); - for (int i = 0; i < count; ++i) { - SectionNode &node = newSectionNodes[i]; - if (node.type == Hour12Section) - node.type = Hour24Section; - } - } - - if (index < max) { - appendSeparator(&newSeparators, newFormat, index, index - max, lastQuote); - } else { - newSeparators.append(QString()); - } - - displayFormat = newFormat; - separators = newSeparators; - sectionNodes = newSectionNodes; - display = newDisplay; - last.pos = -1; - -// for (int i=0; i= sectionNodes.size()) { - qWarning("QDateTimeParser::sectionSize Internal error (%d)", sectionIndex); - return -1; - } - - if (sectionIndex == sectionNodes.size() - 1) { - // In some cases there is a difference between displayText() and text. - // e.g. when text is 2000/01/31 and displayText() is "2000/2/31" - text - // is the previous value and displayText() is the new value. - // The size difference is always due to leading zeroes. - int sizeAdjustment = 0; - const int displayTextSize = displayText().size(); - if (displayTextSize != text.size()) { - // Any zeroes added before this section will affect our size. - int preceedingZeroesAdded = 0; - if (sectionNodes.size() > 1 && context == DateTimeEdit) { - const auto begin = sectionNodes.cbegin(); - const auto end = begin + sectionIndex; - for (auto sectionIt = begin; sectionIt != end; ++sectionIt) - preceedingZeroesAdded += sectionIt->zeroesAdded; - } - sizeAdjustment = preceedingZeroesAdded; - } - - return displayTextSize + sizeAdjustment - sectionPos(sectionIndex) - separators.last().size(); - } else { - return sectionPos(sectionIndex + 1) - sectionPos(sectionIndex) - - separators.at(sectionIndex + 1).size(); - } -} - - -int QDateTimeParser::sectionMaxSize(Section s, int count) const -{ -#if QT_CONFIG(textdate) - int mcount = 12; -#endif - - switch (s) { - case FirstSection: - case NoSection: - case LastSection: return 0; - - case AmPmSection: { - const int lowerMax = qMin(getAmPmText(AmText, LowerCase).size(), - getAmPmText(PmText, LowerCase).size()); - const int upperMax = qMin(getAmPmText(AmText, UpperCase).size(), - getAmPmText(PmText, UpperCase).size()); - return qMin(4, qMin(lowerMax, upperMax)); - } - - case Hour24Section: - case Hour12Section: - case MinuteSection: - case SecondSection: - case DaySection: return 2; - case DayOfWeekSectionShort: - case DayOfWeekSectionLong: -#if !QT_CONFIG(textdate) - return 2; -#else - mcount = 7; - Q_FALLTHROUGH(); -#endif - case MonthSection: -#if !QT_CONFIG(textdate) - return 2; -#else - if (count <= 2) - return 2; - - { - int ret = 0; - const QLocale l = locale(); - const QLocale::FormatType format = count == 4 ? QLocale::LongFormat : QLocale::ShortFormat; - for (int i=1; i<=mcount; ++i) { - const QString str = (s == MonthSection - ? l.monthName(i, format) - : l.dayName(i, format)); - ret = qMax(str.size(), ret); - } - return ret; - } -#endif - case MSecSection: return 3; - case YearSection: return 4; - case YearSection2Digits: return 2; - // Arbitrarily many tokens (each up to 14 bytes) joined with / separators: - case TimeZoneSection: return std::numeric_limits::max(); - - case CalendarPopupSection: - case Internal: - case TimeSectionMask: - case DateSectionMask: - case HourSectionMask: - case YearSectionMask: - case DayOfWeekSectionMask: - case DaySectionMask: - qWarning("QDateTimeParser::sectionMaxSize: Invalid section %s", - SectionNode::name(s).toLatin1().constData()); - - case NoSectionIndex: - case FirstSectionIndex: - case LastSectionIndex: - case CalendarPopupIndex: - // these cases can't happen - break; - } - return -1; -} - - -int QDateTimeParser::sectionMaxSize(int index) const -{ - const SectionNode &sn = sectionNode(index); - return sectionMaxSize(sn.type, sn.count); -} - -/*! - \internal - - Returns the text of section \a s. This function operates on the - arg text rather than edit->text(). -*/ - - -QString QDateTimeParser::sectionText(const QString &text, int sectionIndex, int index) const -{ - const SectionNode &sn = sectionNode(sectionIndex); - switch (sn.type) { - case NoSectionIndex: - case FirstSectionIndex: - case LastSectionIndex: - return QString(); - default: break; - } - - return text.mid(index, sectionSize(sectionIndex)); -} - -QString QDateTimeParser::sectionText(int sectionIndex) const -{ - const SectionNode &sn = sectionNode(sectionIndex); - return sectionText(displayText(), sectionIndex, sn.pos); -} - - -#if QT_CONFIG(datestring) - -QDateTimeParser::ParsedSection -QDateTimeParser::parseSection(const QDateTime ¤tValue, int sectionIndex, - int offset, QString *text) const -{ - ParsedSection result; // initially Invalid - const SectionNode &sn = sectionNode(sectionIndex); - if (sn.type & Internal) { - qWarning("QDateTimeParser::parseSection Internal error (%ls %d)", - qUtf16Printable(sn.name()), sectionIndex); - return result; - } - - const int sectionmaxsize = sectionMaxSize(sectionIndex); - QStringRef sectionTextRef = text->midRef(offset, sectionmaxsize); - - QDTPDEBUG << "sectionValue for" << sn.name() - << "with text" << *text << "and (at" << offset - << ") st:" << sectionTextRef; - - switch (sn.type) { - case AmPmSection: { - QString sectiontext = sectionTextRef.toString(); - int used; - const int ampm = findAmPm(sectiontext, sectionIndex, &used); - switch (ampm) { - case AM: // sectiontext == AM - case PM: // sectiontext == PM - result = ParsedSection(Acceptable, ampm, used); - break; - case PossibleAM: // sectiontext => AM - case PossiblePM: // sectiontext => PM - result = ParsedSection(Intermediate, ampm - 2, used); - break; - case PossibleBoth: // sectiontext => AM|PM - result = ParsedSection(Intermediate, 0, used); - break; - case Neither: - QDTPDEBUG << "invalid because findAmPm(" << sectiontext << ") returned -1"; - break; - default: - QDTPDEBUGN("This should never happen (findAmPm returned %d)", ampm); - break; - } - if (result.state != Invalid) - text->replace(offset, used, sectiontext.constData(), used); - break; } - case TimeZoneSection: -#if QT_CONFIG(timezone) - result = findTimeZone(sectionTextRef, currentValue, - absoluteMax(sectionIndex), - absoluteMin(sectionIndex)); -#endif - break; - case MonthSection: - case DayOfWeekSectionShort: - case DayOfWeekSectionLong: - if (sn.count >= 3) { - QString sectiontext = sectionTextRef.toString(); - int num = 0, used = 0; - if (sn.type == MonthSection) { - const QDate minDate = getMinimum().date(); - const int min = (currentValue.date().year() == minDate.year()) - ? minDate.month() : 1; - num = findMonth(sectiontext.toLower(), min, sectionIndex, §iontext, &used); - } else { - num = findDay(sectiontext.toLower(), 1, sectionIndex, §iontext, &used); - } - - result = ParsedSection(Intermediate, num, used); - if (num != -1) { - text->replace(offset, used, sectiontext.constData(), used); - if (used == sectiontext.size()) - result = ParsedSection(Acceptable, num, used); - } - break; - } - Q_FALLTHROUGH(); - // All numeric: - case DaySection: - case YearSection: - case YearSection2Digits: - case Hour12Section: - case Hour24Section: - case MinuteSection: - case SecondSection: - case MSecSection: { - int sectiontextSize = sectionTextRef.size(); - if (sectiontextSize == 0) { - result = ParsedSection(Intermediate); - } else { - for (int i = 0; i < sectiontextSize; ++i) { - if (sectionTextRef.at(i).isSpace()) - sectiontextSize = i; // which exits the loop - } - - const int absMax = absoluteMax(sectionIndex); - QLocale loc; - bool ok = true; - int last = -1, used = -1; - - Q_ASSERT(sectiontextSize <= sectionmaxsize); - QStringRef digitsStr = sectionTextRef.left(sectiontextSize); - for (int digits = sectiontextSize; digits >= 1; --digits) { - digitsStr.truncate(digits); - int tmp = (int)loc.toUInt(digitsStr, &ok); - if (ok && sn.type == Hour12Section) { - if (tmp > 12) { - tmp = -1; - ok = false; - } else if (tmp == 12) { - tmp = 0; - } - } - if (ok && tmp <= absMax) { - QDTPDEBUG << sectionTextRef.left(digits) << tmp << digits; - last = tmp; - used = digits; - break; - } - } - - if (last == -1) { - QChar first(sectionTextRef.at(0)); - if (separators.at(sectionIndex + 1).startsWith(first)) - result = ParsedSection(Intermediate, 0, used); - else - QDTPDEBUG << "invalid because" << sectionTextRef << "can't become a uint" << last << ok; - } else { - const FieldInfo fi = fieldInfo(sectionIndex); - const bool unfilled = used < sectionmaxsize; - if (unfilled && fi & Fraction) { // typing 2 in a zzz field should be .200, not .002 - for (int i = used; i < sectionmaxsize; ++i) - last *= 10; - } - // Even those *= 10s can't take last above absMax: - Q_ASSERT(last <= absMax); - const int absMin = absoluteMin(sectionIndex); - if (last < absMin) { - if (unfilled) - result = ParsedSection(Intermediate, last, used); - else - QDTPDEBUG << "invalid because" << last << "is less than absoluteMin" << absMin; - } else if (unfilled && (fi & (FixedWidth|Numeric)) == (FixedWidth|Numeric)) { - if (skipToNextSection(sectionIndex, currentValue, digitsStr)) { - const int missingZeroes = sectionmaxsize - digitsStr.size(); - result = ParsedSection(Acceptable, last, sectionmaxsize, missingZeroes); - text->insert(offset, QString(missingZeroes, QLatin1Char('0'))); - ++(const_cast(this)->sectionNodes[sectionIndex].zeroesAdded); - } else { - result = ParsedSection(Intermediate, last, used);; - } - } else { - result = ParsedSection(Acceptable, last, used); - } - } - } - break; } - default: - qWarning("QDateTimeParser::parseSection Internal error (%ls %d)", - qUtf16Printable(sn.name()), sectionIndex); - return result; - } - Q_ASSERT(result.state != Invalid || result.value == -1); - - return result; -} - -/*! - \internal - - Returns a date consistent with the given data on parts specified by known, - while staying as close to the given data as it can. Returns an invalid date - when on valid date is consistent with the data. -*/ - -static QDate actualDate(QDateTimeParser::Sections known, int year, int year2digits, - int month, int day, int dayofweek) -{ - QDate actual(year, month, day); - if (actual.isValid() && year % 100 == year2digits && actual.dayOfWeek() == dayofweek) - return actual; // The obvious candidate is fine :-) - - if (dayofweek < 1 || dayofweek > 7) // Invalid: ignore - known &= ~QDateTimeParser::DayOfWeekSectionMask; - - // Assuming year > 0 ... - if (year % 100 != year2digits) { - if (known & QDateTimeParser::YearSection2Digits) { - // Over-ride year, even if specified: - year += year2digits - year % 100; - known &= ~QDateTimeParser::YearSection; - } else { - year2digits = year % 100; - } - } - Q_ASSERT(year % 100 == year2digits); - - if (month < 1) { // If invalid, clip to nearest valid and ignore in known. - month = 1; - known &= ~QDateTimeParser::MonthSection; - } else if (month > 12) { - month = 12; - known &= ~QDateTimeParser::MonthSection; - } - - QDate first(year, month, 1); - int last = known & QDateTimeParser::YearSection && known & QDateTimeParser::MonthSection - ? first.daysInMonth() : 0; - // If we also know day-of-week, tweak last to the last in the month that matches it: - if (last && known & QDateTimeParser::DayOfWeekSectionMask) { - int diff = (dayofweek - first.dayOfWeek() - last) % 7; - Q_ASSERT(diff <= 0); // C++11 specifies (-ve) % (+ve) to be <= 0. - last += diff; - } - if (day < 1) { - if (known & QDateTimeParser::DayOfWeekSectionMask && last) { - day = 1 + dayofweek - first.dayOfWeek(); - if (day < 1) - day += 7; - } else { - day = 1; - } - known &= ~QDateTimeParser::DaySection; - } else if (day > 31) { - day = last; - known &= ~QDateTimeParser::DaySection; - } else if (last && day > last && (known & QDateTimeParser::DaySection) == 0) { - day = last; - } - - actual = QDate(year, month, day); - if (!actual.isValid() // We can't do better than we have, in this case - || (known & QDateTimeParser::DaySection - && known & QDateTimeParser::MonthSection - && known & QDateTimeParser::YearSection) // ditto - || actual.dayOfWeek() == dayofweek // Good enough, use it. - || (known & QDateTimeParser::DayOfWeekSectionMask) == 0) { // No contradiction, use it. - return actual; - } - - /* - Now it gets trickier. - - We have some inconsistency in our data; we've been told day of week, but - it doesn't fit with our year, month and day. At least one of these is - unknown, though: so we can fix day of week by tweaking it. - */ - - if ((known & QDateTimeParser::DaySection) == 0) { - // Relatively easy to fix. - day += dayofweek - actual.dayOfWeek(); - if (day < 1) - day += 7; - else if (day > actual.daysInMonth()) - day -= 7; - actual = QDate(year, month, day); - return actual; - } - - if ((known & QDateTimeParser::MonthSection) == 0) { - /* - Try possible month-offsets, m, preferring small; at least one (present - month doesn't work) and at most 11 (max month, 12, minus min, 1); try - in both directions, ignoring any offset that takes us out of range. - */ - for (int m = 1; m < 12; m++) { - if (m < month) { - actual = QDate(year, month - m, day); - if (actual.dayOfWeek() == dayofweek) - return actual; - } - if (m + month <= 12) { - actual = QDate(year, month + m, day); - if (actual.dayOfWeek() == dayofweek) - return actual; - } - } - // Should only get here in corner cases; e.g. day == 31 - actual = QDate(year, month, day); // Restore from trial values. - } - - if ((known & QDateTimeParser::YearSection) == 0) { - if (known & QDateTimeParser::YearSection2Digits) { - /* - Two-digit year and month are specified; choice of century can only - fix this if diff is in one of {1, 2, 5} or {2, 4, 6}; but not if - diff is in the other. It's also only reasonable to consider - adjacent century, e.g. if year thinks it's 2012 and two-digit year - is '97, it makes sense to consider 1997. If either adjacent - century does work, the other won't. - */ - actual = QDate(year + 100, month, day); - if (actual.dayOfWeek() == dayofweek) - return actual; - actual = QDate(year - 100, month, day); - if (actual.dayOfWeek() == dayofweek) - return actual; - } else { - // Offset by 7 is usually enough, but rare cases may need more: - for (int y = 1; y < 12; y++) { - actual = QDate(year - y, month, day); - if (actual.dayOfWeek() == dayofweek) - return actual; - actual = QDate(year + y, month, day); - if (actual.dayOfWeek() == dayofweek) - return actual; - } - } - actual = QDate(year, month, day); // Restore from trial values. - } - - return actual; // It'll just have to do :-( -} - -/*! - \internal -*/ - -static QTime actualTime(QDateTimeParser::Sections known, - int hour, int hour12, int ampm, - int minute, int second, int msec) -{ - // If we have no conflict, or don't know enough to diagonose one, use this: - QTime actual(hour, minute, second, msec); - if (hour12 < 0 || hour12 > 12) { // ignore bogus value - known &= ~QDateTimeParser::Hour12Section; - hour12 = hour % 12; - } - - if (ampm == -1 || (known & QDateTimeParser::AmPmSection) == 0) { - if ((known & QDateTimeParser::Hour12Section) == 0 || hour % 12 == hour12) - return actual; - - if ((known & QDateTimeParser::Hour24Section) == 0) - hour = hour12 + (hour > 12 ? 12 : 0); - } else { - Q_ASSERT(ampm == 0 || ampm == 1); - if (hour - hour12 == ampm * 12) - return actual; - - if ((known & QDateTimeParser::Hour24Section) == 0 - && known & QDateTimeParser::Hour12Section) { - hour = hour12 + ampm * 12; - } - } - actual = QTime(hour, minute, second, msec); - return actual; -} - -/*! - \internal -*/ -QDateTimeParser::StateNode -QDateTimeParser::scanString(const QDateTime &defaultValue, - bool fixup, QString *input) const -{ - State state = Acceptable; - bool conflicts = false; - const int sectionNodesCount = sectionNodes.size(); - int padding = 0; - int pos = 0; - int year, month, day; - const QDate defaultDate = defaultValue.date(); - const QTime defaultTime = defaultValue.time(); - defaultDate.getDate(&year, &month, &day); - int year2digits = year % 100; - int hour = defaultTime.hour(); - int hour12 = -1; - int minute = defaultTime.minute(); - int second = defaultTime.second(); - int msec = defaultTime.msec(); - int dayofweek = defaultDate.dayOfWeek(); - Qt::TimeSpec tspec = defaultValue.timeSpec(); - int zoneOffset = 0; // In seconds; local - UTC -#if QT_CONFIG(timezone) - QTimeZone timeZone; -#endif - switch (tspec) { - case Qt::OffsetFromUTC: // timeZone is ignored - zoneOffset = defaultValue.offsetFromUtc(); - break; -#if QT_CONFIG(timezone) - case Qt::TimeZone: - timeZone = defaultValue.timeZone(); - if (timeZone.isValid()) - zoneOffset = timeZone.offsetFromUtc(defaultValue); - // else: is there anything we can do about this ? - break; -#endif - default: // zoneOffset and timeZone are ignored - break; - } - - int ampm = -1; - Sections isSet = NoSection; - - for (int index = 0; index < sectionNodesCount; ++index) { - Q_ASSERT(state != Invalid); - const QString &separator = separators.at(index); - if (input->midRef(pos, separator.size()) != separator) { - QDTPDEBUG << "invalid because" << input->midRef(pos, separator.size()) - << "!=" << separator - << index << pos << currentSectionIndex; - return StateNode(); - } - pos += separator.size(); - sectionNodes[index].pos = pos; - int *current = 0; - const SectionNode sn = sectionNodes.at(index); - ParsedSection sect; - - { - const QDate date = actualDate(isSet, year, year2digits, month, day, dayofweek); - const QTime time = actualTime(isSet, hour, hour12, ampm, minute, second, msec); - sect = parseSection( -#if QT_CONFIG(timezone) - tspec == Qt::TimeZone ? QDateTime(date, time, timeZone) : -#endif - QDateTime(date, time, tspec, zoneOffset), - index, pos, input); - } - - QDTPDEBUG << "sectionValue" << sn.name() << *input - << "pos" << pos << "used" << sect.used << stateName(sect.state); - - padding += sect.zeroes; - if (fixup && sect.state == Intermediate && sect.used < sn.count) { - const FieldInfo fi = fieldInfo(index); - if ((fi & (Numeric|FixedWidth)) == (Numeric|FixedWidth)) { - const QString newText = QString::fromLatin1("%1").arg(sect.value, sn.count, 10, QLatin1Char('0')); - input->replace(pos, sect.used, newText); - sect.used = sn.count; - } - } - - state = qMin(state, sect.state); - // QDateTimeEdit can fix Intermediate and zeroes, but input needing that didn't match format: - if (state == Invalid || (context == FromString && (state == Intermediate || sect.zeroes))) - return StateNode(); - - switch (sn.type) { - case TimeZoneSection: - current = &zoneOffset; - if (sect.used > 0) { -#if QT_CONFIG(timezone) // Synchronize with what findTimeZone() found: - QStringRef zoneName = input->midRef(pos, sect.used); - Q_ASSERT(!zoneName.isEmpty()); // sect.used > 0 - const QByteArray latinZone(zoneName == QLatin1String("Z") - ? QByteArray("UTC") : zoneName.toLatin1()); - timeZone = QTimeZone(latinZone); - tspec = timeZone.isValid() - ? (QTimeZone::isTimeZoneIdAvailable(latinZone) - ? Qt::TimeZone - : Qt::OffsetFromUTC) - : (Q_ASSERT(startsWithLocalTimeZone(zoneName)), Qt::LocalTime); -#else - tspec = Qt::LocalTime; -#endif - } - break; - case Hour24Section: current = &hour; break; - case Hour12Section: current = &hour12; break; - case MinuteSection: current = &minute; break; - case SecondSection: current = &second; break; - case MSecSection: current = &msec; break; - case YearSection: current = &year; break; - case YearSection2Digits: current = &year2digits; break; - case MonthSection: current = &month; break; - case DayOfWeekSectionShort: - case DayOfWeekSectionLong: current = &dayofweek; break; - case DaySection: current = &day; sect.value = qMax(1, sect.value); break; - case AmPmSection: current = &m; break; - default: - qWarning("QDateTimeParser::parse Internal error (%ls)", - qUtf16Printable(sn.name())); - break; - } - - if (sect.used > 0) - pos += sect.used; - QDTPDEBUG << index << sn.name() << "is set to" - << pos << "state is" << stateName(state); - - if (!current) { - qWarning("QDateTimeParser::parse Internal error 2"); - return StateNode(); - } - if (isSet & sn.type && *current != sect.value) { - QDTPDEBUG << "CONFLICT " << sn.name() << *current << sect.value; - conflicts = true; - if (index != currentSectionIndex || sect.state == Invalid) { - continue; - } - } - if (sect.state != Invalid) - *current = sect.value; - - // Record the present section: - isSet |= sn.type; - } - - if (input->midRef(pos) != separators.last()) { - QDTPDEBUG << "invalid because" << input->midRef(pos) - << "!=" << separators.last() << pos; - return StateNode(); - } - - if (parserType != QVariant::Time) { - if (year % 100 != year2digits && (isSet & YearSection2Digits)) { - if (!(isSet & YearSection)) { - year = (year / 100) * 100; - year += year2digits; - } else { - conflicts = true; - const SectionNode &sn = sectionNode(currentSectionIndex); - if (sn.type == YearSection2Digits) { - year = (year / 100) * 100; - year += year2digits; - } - } - } - - const QDate date(year, month, day); - const int diff = dayofweek - date.dayOfWeek(); - if (diff != 0 && state == Acceptable && isSet & DayOfWeekSectionMask) { - if (isSet & DaySection) - conflicts = true; - const SectionNode &sn = sectionNode(currentSectionIndex); - if (sn.type & DayOfWeekSectionMask || currentSectionIndex == -1) { - // dayofweek should be preferred - day += diff; - if (day <= 0) { - day += 7; - } else if (day > date.daysInMonth()) { - day -= 7; - } - QDTPDEBUG << year << month << day << dayofweek - << diff << QDate(year, month, day).dayOfWeek(); - } - } - - bool needfixday = false; - if (sectionType(currentSectionIndex) & DaySectionMask) { - cachedDay = day; - } else if (cachedDay > day) { - day = cachedDay; - needfixday = true; - } - - if (!QDate::isValid(year, month, day)) { - if (day < 32) { - cachedDay = day; - } - if (day > 28 && QDate::isValid(year, month, 1)) { - needfixday = true; - } - } - if (needfixday) { - if (context == FromString) { - return StateNode(); - } - if (state == Acceptable && fixday) { - day = qMin(day, QDate(year, month, 1).daysInMonth()); - - const QLocale loc = locale(); - for (int i=0; ireplace(sectionPos(sn), sectionSize(i), loc.toString(day)); - } else if (sn.type & DayOfWeekSectionMask) { - const int dayOfWeek = QDate(year, month, day).dayOfWeek(); - const QLocale::FormatType dayFormat = - (sn.type == DayOfWeekSectionShort - ? QLocale::ShortFormat : QLocale::LongFormat); - const QString dayName(loc.dayName(dayOfWeek, dayFormat)); - input->replace(sectionPos(sn), sectionSize(i), dayName); - } - } - } else if (state > Intermediate) { - state = Intermediate; - } - } - } - - if (parserType != QVariant::Date) { - if (isSet & Hour12Section) { - const bool hasHour = isSet & Hour24Section; - if (ampm == -1) { - if (hasHour) { - ampm = (hour < 12 ? 0 : 1); - } else { - ampm = 0; // no way to tell if this is am or pm so I assume am - } - } - hour12 = (ampm == 0 ? hour12 % 12 : (hour12 % 12) + 12); - if (!hasHour) { - hour = hour12; - } else if (hour != hour12) { - conflicts = true; - } - } else if (ampm != -1) { - if (!(isSet & (Hour24Section))) { - hour = (12 * ampm); // special case. Only ap section - } else if ((ampm == 0) != (hour < 12)) { - conflicts = true; - } - } - - } - - QDTPDEBUG << year << month << day << hour << minute << second << msec; - Q_ASSERT(state != Invalid); - - const QDate date(year, month, day); - const QTime time(hour, minute, second, msec); - const QDateTime when = -#if QT_CONFIG(timezone) - tspec == Qt::TimeZone ? QDateTime(date, time, timeZone) : -#endif - QDateTime(date, time, tspec, zoneOffset); - - // If hour wasn't specified, check the default we're using exists on the - // given date (which might be a spring-forward, skipping an hour). - if (parserType == QVariant::DateTime && !(isSet & HourSectionMask) && !when.isValid()) { - qint64 msecs = when.toMSecsSinceEpoch(); - // Fortunately, that gets a useful answer ... - const QDateTime replace = -#if QT_CONFIG(timezone) - tspec == Qt::TimeZone - ? QDateTime::fromMSecsSinceEpoch(msecs, timeZone) : -#endif - QDateTime::fromMSecsSinceEpoch(msecs, tspec, zoneOffset); - const QTime tick = replace.time(); - if (replace.date() == date - && (!(isSet & MinuteSection) || tick.minute() == minute) - && (!(isSet & SecondSection) || tick.second() == second) - && (!(isSet & MSecSection) || tick.msec() == msec)) { - return StateNode(replace, state, padding, conflicts); - } - } - - return StateNode(when, state, padding, conflicts); -} - -/*! - \internal -*/ - -QDateTimeParser::StateNode -QDateTimeParser::parse(QString input, int position, const QDateTime &defaultValue, bool fixup) const -{ - const QDateTime minimum = getMinimum(); - const QDateTime maximum = getMaximum(); - - QDTPDEBUG << "parse" << input; - StateNode scan = scanString(defaultValue, fixup, &input); - QDTPDEBUGN("'%s' => '%s'(%s)", input.toLatin1().constData(), - scan.value.toString(QLatin1String("yyyy/MM/dd hh:mm:ss.zzz")).toLatin1().constData(), - stateName(scan.state).toLatin1().constData()); - - if (scan.value.isValid() && scan.state != Invalid) { - if (context != FromString && scan.value < minimum) { - const QLatin1Char space(' '); - if (scan.value >= minimum) - qWarning("QDateTimeParser::parse Internal error 3 (%ls %ls)", - qUtf16Printable(scan.value.toString()), qUtf16Printable(minimum.toString())); - - bool done = false; - scan.state = Invalid; - const int sectionNodesCount = sectionNodes.size(); - for (int i=0; i= minimum && copy <= maximum) { - scan.state = Intermediate; - done = true; - } - break; } - } - Q_FALLTHROUGH(); - case MonthSection: - if (sn.count >= 3) { - const int finalMonth = scan.value.date().month(); - int tmp = finalMonth; - // I know the first possible month makes the date too early - while ((tmp = findMonth(t, tmp + 1, i)) != -1) { - const QDateTime copy(scan.value.addMonths(tmp - finalMonth)); - if (copy >= minimum && copy <= maximum) - break; // break out of while - } - if (tmp != -1) { - scan.state = Intermediate; - done = true; - } - break; - } - Q_FALLTHROUGH(); - default: { - int toMin; - int toMax; - - if (sn.type & TimeSectionMask) { - if (scan.value.daysTo(minimum) != 0) { - break; - } - const QTime time = scan.value.time(); - toMin = time.msecsTo(minimum.time()); - if (scan.value.daysTo(maximum) > 0) - toMax = -1; // can't get to max - else - toMax = time.msecsTo(maximum.time()); - } else { - toMin = scan.value.daysTo(minimum); - toMax = scan.value.daysTo(maximum); - } - const int maxChange = sn.maxChange(); - if (toMin > maxChange) { - QDTPDEBUG << "invalid because toMin > maxChange" << toMin - << maxChange << t << scan.value << minimum; - scan.state = Invalid; - done = true; - break; - } else if (toMax > maxChange) { - toMax = -1; // can't get to max - } - - const int min = getDigit(minimum, i); - if (min == -1) { - qWarning("QDateTimeParser::parse Internal error 4 (%ls)", - qUtf16Printable(sn.name())); - scan.state = Invalid; - done = true; - break; - } - - int max = toMax != -1 ? getDigit(maximum, i) : absoluteMax(i, scan.value); - int pos = position + scan.padded - sn.pos; - if (pos < 0 || pos >= t.size()) - pos = -1; - if (!potentialValue(t.simplified(), min, max, i, scan.value, pos)) { - QDTPDEBUG << "invalid because potentialValue(" << t.simplified() << min << max - << sn.name() << "returned" << toMax << toMin << pos; - scan.state = Invalid; - done = true; - break; - } - scan.state = Intermediate; - done = true; - break; } - } - } - } - } else { - if (context == FromString) { - // optimization - Q_ASSERT(maximum.date().toJulianDay() == 5373484); - if (scan.value.date().toJulianDay() > 5373484) - scan.state = Invalid; - } else { - if (scan.value > maximum) - scan.state = Invalid; - } - - QDTPDEBUG << "not checking intermediate because scanned value is" << scan.value << minimum << maximum; - } - } - text = scan.input = input; - // Set spec *after* all checking, so validity is a property of the string: - scan.value = scan.value.toTimeSpec(spec); - return scan; -} - -/* - \internal - \brief Returns the index in \a entries with the best prefix match to \a text - - Scans \a entries looking for an entry overlapping \a text as much as possible - (an exact match beats any prefix match; a match of the full entry as prefix of - text beats any entry but one matching a longer prefix; otherwise, the match of - longest prefix wins, earlier entries beating later on a draw). Records the - length of overlap in *used (if \a used is non-NULL) and the first entry that - overlapped this much in *usedText (if \a usedText is non-NULL). - */ -static int findTextEntry(const QString &text, const QVector &entries, QString *usedText, int *used) -{ - if (text.isEmpty()) - return -1; - - int bestMatch = -1; - int bestCount = 0; - for (int n = 0; n < entries.size(); ++n) - { - const QString &name = entries.at(n); - - const int limit = qMin(text.size(), name.size()); - int i = 0; - while (i < limit && text.at(i) == name.at(i).toLower()) - ++i; - // Full match beats an equal prefix match: - if (i > bestCount || (i == bestCount && i == name.size())) { - bestCount = i; - bestMatch = n; - if (i == name.size() && i == text.size()) - break; // Exact match, name == text, wins. - } - } - if (usedText && bestMatch != -1) - *usedText = entries.at(bestMatch); - if (used) - *used = bestCount; - - return bestMatch; -} - -/*! - \internal - finds the first possible monthname that \a str1 can - match. Starting from \a index; str should already by lowered -*/ - -int QDateTimeParser::findMonth(const QString &str1, int startMonth, int sectionIndex, - QString *usedMonth, int *used) const -{ - const SectionNode &sn = sectionNode(sectionIndex); - if (sn.type != MonthSection) { - qWarning("QDateTimeParser::findMonth Internal error"); - return -1; - } - - QLocale::FormatType type = sn.count == 3 ? QLocale::ShortFormat : QLocale::LongFormat; - QLocale l = locale(); - QVector monthNames; - monthNames.reserve(13 - startMonth); - for (int month = startMonth; month <= 12; ++month) - monthNames.append(l.monthName(month, type)); - - const int index = findTextEntry(str1, monthNames, usedMonth, used); - return index < 0 ? index : index + startMonth; -} - -int QDateTimeParser::findDay(const QString &str1, int startDay, int sectionIndex, QString *usedDay, int *used) const -{ - const SectionNode &sn = sectionNode(sectionIndex); - if (!(sn.type & DaySectionMask)) { - qWarning("QDateTimeParser::findDay Internal error"); - return -1; - } - - QLocale::FormatType type = sn.count == 4 ? QLocale::LongFormat : QLocale::ShortFormat; - QLocale l = locale(); - QVector daysOfWeek; - daysOfWeek.reserve(8 - startDay); - for (int day = startDay; day <= 7; ++day) - daysOfWeek.append(l.dayName(day, type)); - - const int index = findTextEntry(str1, daysOfWeek, usedDay, used); - return index < 0 ? index : index + startDay; -} - -/*! - \internal - - Return's .value is zone's offset, zone time - UTC time, in seconds. - See QTimeZonePrivate::isValidId() for the format of zone names. - */ -QDateTimeParser::ParsedSection -QDateTimeParser::findTimeZone(QStringRef str, const QDateTime &when, - int maxVal, int minVal) const -{ -#if QT_CONFIG(timezone) - int index = startsWithLocalTimeZone(str); - int offset; - - if (index > 0) { - // We won't actually use this, but we need a valid return: - offset = QDateTime(when.date(), when.time(), Qt::LocalTime).offsetFromUtc(); - } else { - int size = str.length(); - offset = std::numeric_limits::max(); // deliberately out of range - Q_ASSERT(offset > QTimeZone::MaxUtcOffsetSecs); // cf. absoluteMax() - - // Collect up plausibly-valid characters; let QTimeZone work out what's truly valid. - while (index < size) { - QChar here = str[index]; - if (here < 127 - && (here.isLetterOrNumber() - || here == '/' || here == '-' - || here == '_' || here == '.' - || here == '+' || here == ':')) - index++; - else - break; - } - - while (index > 0) { - str.truncate(index); - if (str == QLatin1String("Z")) { - offset = 0; // "Zulu" time - a.k.a. UTC - break; - } - QTimeZone zone(str.toLatin1()); - if (zone.isValid()) { - offset = zone.offsetFromUtc(when); - break; - } - index--; // maybe we collected too much ... - } - } - - if (index > 0 && maxVal >= offset && offset >= minVal) - return ParsedSection(Acceptable, offset, index); - -#endif // timezone - return ParsedSection(); -} - -/*! - \internal - - Returns - AM if str == tr("AM") - PM if str == tr("PM") - PossibleAM if str can become tr("AM") - PossiblePM if str can become tr("PM") - PossibleBoth if str can become tr("PM") and can become tr("AM") - Neither if str can't become anything sensible -*/ -QDateTimeParser::AmPmFinder QDateTimeParser::findAmPm(QString &str, int sectionIndex, int *used) const -{ - const SectionNode &s = sectionNode(sectionIndex); - if (s.type != AmPmSection) { - qWarning("QDateTimeParser::findAmPm Internal error"); - return Neither; - } - if (used) - *used = str.size(); - if (QStringRef(&str).trimmed().isEmpty()) { - return PossibleBoth; - } - const QLatin1Char space(' '); - int size = sectionMaxSize(sectionIndex); - - enum { - amindex = 0, - pmindex = 1 - }; - QString ampm[2]; - ampm[amindex] = getAmPmText(AmText, s.count == 1 ? UpperCase : LowerCase); - ampm[pmindex] = getAmPmText(PmText, s.count == 1 ? UpperCase : LowerCase); - for (int i=0; i<2; ++i) - ampm[i].truncate(size); - - QDTPDEBUG << "findAmPm" << str << ampm[0] << ampm[1]; - - if (str.indexOf(ampm[amindex], 0, Qt::CaseInsensitive) == 0) { - str = ampm[amindex]; - return AM; - } else if (str.indexOf(ampm[pmindex], 0, Qt::CaseInsensitive) == 0) { - str = ampm[pmindex]; - return PM; - } else if (context == FromString || (str.count(space) == 0 && str.size() >= size)) { - return Neither; - } - size = qMin(size, str.size()); - - bool broken[2] = {false, false}; - for (int i=0; i= min && val <= max && str.size() == size) { - return true; - } else if (val > max) { - return false; - } else if (str.size() == size && val < min) { - return false; - } - - const int len = size - str.size(); - for (int i=0; i= 0) { - const QString tmp = str.left(insert) + QLatin1Char('0' + j) + str.mid(insert); - if (potentialValue(tmp, min, max, index, currentValue, insert)) - return true; - } - } - } - - return false; -} - -/*! - \internal -*/ -bool QDateTimeParser::skipToNextSection(int index, const QDateTime ¤t, const QStringRef &text) const -{ - Q_ASSERT(text.size() < sectionMaxSize(index)); - const SectionNode &node = sectionNode(index); - int min = absoluteMin(index); - int max = absoluteMax(index, current); - // Time-zone field is only numeric if given as offset from UTC: - if (node.type != TimeZoneSection || current.timeSpec() == Qt::OffsetFromUTC) { - const QDateTime maximum = getMaximum(); - const QDateTime minimum = getMinimum(); - Q_ASSERT(current >= minimum && current <= maximum); - - QDateTime tmp = current; - if (!setDigit(tmp, index, min) || tmp < minimum) - min = getDigit(minimum, index); - - if (!setDigit(tmp, index, max) || tmp > maximum) - max = getDigit(maximum, index); - } - int pos = cursorPosition() - node.pos; - if (pos < 0 || pos >= text.size()) - pos = -1; - - /* - If the value potentially can become another valid entry we don't want to - skip to the next. E.g. In a M field (month without leading 0) if you type - 1 we don't want to autoskip (there might be [012] following) but if you - type 3 we do. - */ - return !potentialValue(text, min, max, index, current, pos); -} - -/*! - \internal - For debugging. Returns the name of the section \a s. -*/ - -QString QDateTimeParser::SectionNode::name(QDateTimeParser::Section s) -{ - switch (s) { - case QDateTimeParser::AmPmSection: return QLatin1String("AmPmSection"); - case QDateTimeParser::DaySection: return QLatin1String("DaySection"); - case QDateTimeParser::DayOfWeekSectionShort: return QLatin1String("DayOfWeekSectionShort"); - case QDateTimeParser::DayOfWeekSectionLong: return QLatin1String("DayOfWeekSectionLong"); - case QDateTimeParser::Hour24Section: return QLatin1String("Hour24Section"); - case QDateTimeParser::Hour12Section: return QLatin1String("Hour12Section"); - case QDateTimeParser::MSecSection: return QLatin1String("MSecSection"); - case QDateTimeParser::MinuteSection: return QLatin1String("MinuteSection"); - case QDateTimeParser::MonthSection: return QLatin1String("MonthSection"); - case QDateTimeParser::SecondSection: return QLatin1String("SecondSection"); - case QDateTimeParser::TimeZoneSection: return QLatin1String("TimeZoneSection"); - case QDateTimeParser::YearSection: return QLatin1String("YearSection"); - case QDateTimeParser::YearSection2Digits: return QLatin1String("YearSection2Digits"); - case QDateTimeParser::NoSection: return QLatin1String("NoSection"); - case QDateTimeParser::FirstSection: return QLatin1String("FirstSection"); - case QDateTimeParser::LastSection: return QLatin1String("LastSection"); - default: return QLatin1String("Unknown section ") + QString::number(int(s)); - } -} - -/*! - \internal - For debugging. Returns the name of the state \a s. -*/ - -QString QDateTimeParser::stateName(State s) const -{ - switch (s) { - case Invalid: return QLatin1String("Invalid"); - case Intermediate: return QLatin1String("Intermediate"); - case Acceptable: return QLatin1String("Acceptable"); - default: return QLatin1String("Unknown state ") + QString::number(s); - } -} - -#if QT_CONFIG(datestring) -bool QDateTimeParser::fromString(const QString &t, QDate *date, QTime *time) const -{ - QDateTime val(QDate(1900, 1, 1).startOfDay()); - const StateNode tmp = parse(t, -1, val, false); - if (tmp.state != Acceptable || tmp.conflicts) { - return false; - } - if (time) { - const QTime t = tmp.value.time(); - if (!t.isValid()) { - return false; - } - *time = t; - } - - if (date) { - const QDate d = tmp.value.date(); - if (!d.isValid()) { - return false; - } - *date = d; - } - return true; -} -#endif // datestring - -QDateTime QDateTimeParser::getMinimum() const -{ - // Cache the most common case - if (spec == Qt::LocalTime) { - static const QDateTime localTimeMin(QDATETIMEEDIT_DATE_MIN.startOfDay(Qt::LocalTime)); - return localTimeMin; - } - return QDateTime(QDATETIMEEDIT_DATE_MIN.startOfDay(spec)); -} - -QDateTime QDateTimeParser::getMaximum() const -{ - // Cache the most common case - if (spec == Qt::LocalTime) { - static const QDateTime localTimeMax(QDATETIMEEDIT_DATE_MAX.endOfDay(Qt::LocalTime)); - return localTimeMax; - } - return QDateTime(QDATETIMEEDIT_DATE_MAX.endOfDay(spec)); -} - -QString QDateTimeParser::getAmPmText(AmPm ap, Case cs) const -{ - const QLocale loc = locale(); - QString raw = ap == AmText ? loc.amText() : loc.pmText(); - return cs == UpperCase ? raw.toUpper() : raw.toLower(); -} - -/* - \internal - - I give arg2 preference because arg1 is always a QDateTime. -*/ - -bool operator==(const QDateTimeParser::SectionNode &s1, const QDateTimeParser::SectionNode &s2) -{ - return (s1.type == s2.type) && (s1.pos == s2.pos) && (s1.count == s2.count); -} - -QT_END_NAMESPACE diff --git a/src/corelib/tools/qdatetimeparser_p.h b/src/corelib/tools/qdatetimeparser_p.h deleted file mode 100644 index d9e39f0795..0000000000 --- a/src/corelib/tools/qdatetimeparser_p.h +++ /dev/null @@ -1,310 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QDATETIMEPARSER_P_H -#define QDATETIMEPARSER_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include -#include "qplatformdefs.h" -#include "QtCore/qatomic.h" -#include "QtCore/qdatetime.h" -#include "QtCore/qstringlist.h" -#include "QtCore/qlocale.h" -#ifndef QT_BOOTSTRAPPED -# include "QtCore/qvariant.h" -#endif -#include "QtCore/qvector.h" -#include "QtCore/qcoreapplication.h" - -QT_REQUIRE_CONFIG(datetimeparser); - -#define QDATETIMEEDIT_TIME_MIN QTime(0, 0) // Prefer QDate::startOfDay() -#define QDATETIMEEDIT_TIME_MAX QTime(23, 59, 59, 999) // Prefer QDate::endOfDay() -#define QDATETIMEEDIT_DATE_MIN QDate(100, 1, 1) -#define QDATETIMEEDIT_COMPAT_DATE_MIN QDate(1752, 9, 14) -#define QDATETIMEEDIT_DATE_MAX QDate(9999, 12, 31) -#define QDATETIMEEDIT_DATE_INITIAL QDate(2000, 1, 1) - -QT_BEGIN_NAMESPACE - -class Q_CORE_EXPORT QDateTimeParser -{ - Q_DECLARE_TR_FUNCTIONS(QDateTimeParser) -public: - enum Context { - FromString, - DateTimeEdit - }; - QDateTimeParser(QVariant::Type t, Context ctx) - : currentSectionIndex(-1), display(nullptr), cachedDay(-1), parserType(t), - fixday(false), spec(Qt::LocalTime), context(ctx) - { - defaultLocale = QLocale::system(); - first.type = FirstSection; - first.pos = -1; - first.count = -1; - first.zeroesAdded = 0; - last.type = LastSection; - last.pos = -1; - last.count = -1; - last.zeroesAdded = 0; - none.type = NoSection; - none.pos = -1; - none.count = -1; - none.zeroesAdded = 0; - } - virtual ~QDateTimeParser(); - - enum Section { - NoSection = 0x00000, - AmPmSection = 0x00001, - MSecSection = 0x00002, - SecondSection = 0x00004, - MinuteSection = 0x00008, - Hour12Section = 0x00010, - Hour24Section = 0x00020, - TimeZoneSection = 0x00040, - HourSectionMask = (Hour12Section | Hour24Section), - TimeSectionMask = (MSecSection | SecondSection | MinuteSection | - HourSectionMask | AmPmSection | TimeZoneSection), - - DaySection = 0x00100, - MonthSection = 0x00200, - YearSection = 0x00400, - YearSection2Digits = 0x00800, - YearSectionMask = YearSection | YearSection2Digits, - DayOfWeekSectionShort = 0x01000, - DayOfWeekSectionLong = 0x02000, - DayOfWeekSectionMask = DayOfWeekSectionShort | DayOfWeekSectionLong, - DaySectionMask = DaySection | DayOfWeekSectionMask, - DateSectionMask = DaySectionMask | MonthSection | YearSectionMask, - - Internal = 0x10000, - FirstSection = 0x20000 | Internal, - LastSection = 0x40000 | Internal, - CalendarPopupSection = 0x80000 | Internal, - - NoSectionIndex = -1, - FirstSectionIndex = -2, - LastSectionIndex = -3, - CalendarPopupIndex = -4 - }; // extending qdatetimeedit.h's equivalent - Q_DECLARE_FLAGS(Sections, Section) - - struct Q_CORE_EXPORT SectionNode { - Section type; - mutable int pos; - int count; - int zeroesAdded; - - static QString name(Section s); - QString name() const { return name(type); } - QString format() const; - int maxChange() const; - }; - - enum State { // duplicated from QValidator - Invalid, - Intermediate, - Acceptable - }; - - struct StateNode { - StateNode() : state(Invalid), padded(0), conflicts(false) {} - StateNode(const QDateTime &val, State ok=Acceptable, int pad=0, bool bad=false) - : value(val), state(ok), padded(pad), conflicts(bad) {} - QString input; - QDateTime value; - State state; - int padded; - bool conflicts; - }; - - enum AmPm { - AmText, - PmText - }; - - enum Case { - UpperCase, - LowerCase - }; - -#if QT_CONFIG(datestring) - StateNode parse(QString input, int position, const QDateTime &defaultValue, bool fixup) const; - bool fromString(const QString &text, QDate *date, QTime *time) const; -#endif - bool parseFormat(const QString &format); - - enum FieldInfoFlag { - Numeric = 0x01, - FixedWidth = 0x02, - AllowPartial = 0x04, - Fraction = 0x08 - }; - Q_DECLARE_FLAGS(FieldInfo, FieldInfoFlag) - - FieldInfo fieldInfo(int index) const; - - void setDefaultLocale(const QLocale &loc) { defaultLocale = loc; } - virtual QString displayText() const { return text; } - -private: - int sectionMaxSize(Section s, int count) const; - QString sectionText(const QString &text, int sectionIndex, int index) const; -#if QT_CONFIG(datestring) - StateNode scanString(const QDateTime &defaultValue, - bool fixup, QString *input) const; - struct ParsedSection { - int value; - int used; - int zeroes; - State state; - Q_DECL_CONSTEXPR ParsedSection(State ok = Invalid, - int val = 0, int read = 0, int zs = 0) - : value(ok == Invalid ? -1 : val), used(read), zeroes(zs), state(ok) - {} - }; - ParsedSection parseSection(const QDateTime ¤tValue, int sectionIndex, - int offset, QString *text) const; - int findMonth(const QString &str1, int monthstart, int sectionIndex, - QString *monthName = nullptr, int *used = nullptr) const; - int findDay(const QString &str1, int intDaystart, int sectionIndex, - QString *dayName = nullptr, int *used = nullptr) const; - ParsedSection findTimeZone(QStringRef str, const QDateTime &when, - int maxVal, int minVal) const; -#if QT_CONFIG(timezone) - // Implemented in qdatetime.cpp: - static int startsWithLocalTimeZone(const QStringRef name); -#endif - - enum AmPmFinder { - Neither = -1, - AM = 0, - PM = 1, - PossibleAM = 2, - PossiblePM = 3, - PossibleBoth = 4 - }; - AmPmFinder findAmPm(QString &str, int index, int *used = nullptr) const; -#endif // datestring - - bool potentialValue(const QStringRef &str, int min, int max, int index, - const QDateTime ¤tValue, int insert) const; - bool potentialValue(const QString &str, int min, int max, int index, - const QDateTime ¤tValue, int insert) const - { - return potentialValue(QStringRef(&str), min, max, index, currentValue, insert); - } - -protected: // for the benefit of QDateTimeEditPrivate - int sectionSize(int index) const; - int sectionMaxSize(int index) const; - int sectionPos(int index) const; - int sectionPos(const SectionNode &sn) const; - - const SectionNode §ionNode(int index) const; - Section sectionType(int index) const; - QString sectionText(int sectionIndex) const; - int getDigit(const QDateTime &dt, int index) const; - bool setDigit(QDateTime &t, int index, int newval) const; - - int absoluteMax(int index, const QDateTime &value = QDateTime()) const; - int absoluteMin(int index) const; - - bool skipToNextSection(int section, const QDateTime ¤t, const QStringRef §ionText) const; - bool skipToNextSection(int section, const QDateTime ¤t, const QString §ionText) const - { - return skipToNextSection(section, current, QStringRef(§ionText)); - } - QString stateName(State s) const; - virtual QDateTime getMinimum() const; - virtual QDateTime getMaximum() const; - virtual int cursorPosition() const { return -1; } - virtual QString getAmPmText(AmPm ap, Case cs) const; - virtual QLocale locale() const { return defaultLocale; } - - mutable int currentSectionIndex; - Sections display; - /* - This stores the most recently selected day. - It is useful when considering the following scenario: - - 1. Date is: 31/01/2000 - 2. User increments month: 29/02/2000 - 3. User increments month: 31/03/2000 - - At step 1, cachedDay stores 31. At step 2, the 31 is invalid for February, so the cachedDay is not updated. - At step 3, the month is changed to March, for which 31 is a valid day. Since 29 < 31, the day is set to cachedDay. - This is good for when users have selected their desired day and are scrolling up or down in the month or year section - and do not want smaller months (or non-leap years) to alter the day that they chose. - */ - mutable int cachedDay; - mutable QString text; - QVector sectionNodes; - SectionNode first, last, none, popup; - QStringList separators; - QString displayFormat; - QLocale defaultLocale; - QVariant::Type parserType; - bool fixday; - Qt::TimeSpec spec; // spec if used by QDateTimeEdit - Context context; -}; -Q_DECLARE_TYPEINFO(QDateTimeParser::SectionNode, Q_PRIMITIVE_TYPE); - -Q_CORE_EXPORT bool operator==(const QDateTimeParser::SectionNode &s1, const QDateTimeParser::SectionNode &s2); - -Q_DECLARE_OPERATORS_FOR_FLAGS(QDateTimeParser::Sections) -Q_DECLARE_OPERATORS_FOR_FLAGS(QDateTimeParser::FieldInfo) - -QT_END_NAMESPACE - -#endif // QDATETIME_P_H diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp index f6eaa53c3a..c8740e55f3 100644 --- a/src/corelib/tools/qlocale.cpp +++ b/src/corelib/tools/qlocale.cpp @@ -55,7 +55,7 @@ #include "qlocale_p.h" #include "qlocale_tools_p.h" #if QT_CONFIG(datetimeparser) -#include "qdatetimeparser_p.h" +#include "private/qdatetimeparser_p.h" #endif #include "qnamespace.h" #include "qdatetime.h" diff --git a/src/corelib/tools/qtimezone.cpp b/src/corelib/tools/qtimezone.cpp deleted file mode 100644 index ef323de14a..0000000000 --- a/src/corelib/tools/qtimezone.cpp +++ /dev/null @@ -1,997 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 John Layt -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include "qtimezone.h" -#include "qtimezoneprivate_p.h" - -#include -#include - -#include - -#include - -QT_BEGIN_NAMESPACE - -// Create default time zone using appropriate backend -static QTimeZonePrivate *newBackendTimeZone() -{ -#ifdef QT_NO_SYSTEMLOCALE -#if QT_CONFIG(icu) - return new QIcuTimeZonePrivate(); -#else - return new QUtcTimeZonePrivate(); -#endif -#else -#if defined Q_OS_MAC - return new QMacTimeZonePrivate(); -#elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED) - return new QAndroidTimeZonePrivate(); -#elif defined(Q_OS_UNIX) || defined(Q_OS_ANDROID_EMBEDDED) - return new QTzTimeZonePrivate(); -#elif QT_CONFIG(icu) - return new QIcuTimeZonePrivate(); -#elif defined Q_OS_WIN - return new QWinTimeZonePrivate(); -#else - return new QUtcTimeZonePrivate(); -#endif // System Locales -#endif // QT_NO_SYSTEMLOCALE -} - -// Create named time zone using appropriate backend -static QTimeZonePrivate *newBackendTimeZone(const QByteArray &ianaId) -{ -#ifdef QT_NO_SYSTEMLOCALE -#if QT_CONFIG(icu) - return new QIcuTimeZonePrivate(ianaId); -#else - return new QUtcTimeZonePrivate(ianaId); -#endif -#else -#if defined Q_OS_MAC - return new QMacTimeZonePrivate(ianaId); -#elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED) - return new QAndroidTimeZonePrivate(ianaId); -#elif defined(Q_OS_UNIX) || defined(Q_OS_ANDROID_EMBEDDED) - return new QTzTimeZonePrivate(ianaId); -#elif QT_CONFIG(icu) - return new QIcuTimeZonePrivate(ianaId); -#elif defined Q_OS_WIN - return new QWinTimeZonePrivate(ianaId); -#else - return new QUtcTimeZonePrivate(ianaId); -#endif // System Locales -#endif // QT_NO_SYSTEMLOCALE -} - -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 IANA 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 backend; -}; - -Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz); - -/*! - \class QTimeZone - \inmodule QtCore - \since 5.2 - - \brief The QTimeZone class converts 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 Remarks - - \section2 IANA Time Zone IDs - - QTimeZone uses the IANA 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 IANA IDs - and the IANA Database natively, but for Windows a mapping is required to - the native IDs. See below for more details. - - The IANA 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 IANA IDs are available. - - The IANA IDs and database are also know as the Olson IDs and database, - named after their creator. - - \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 IANA 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 IANA time zone - ID which on Unix-like systems will always be correct. On Windows this ID is - translated from 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-saving 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-saving time offset is the - number of seconds to add to the standard time offset to obtain - daylight-saving time (abbreviated DST and sometimes called "daylight time" - or "summer time") in the time zone. - - Note that the standard and DST offsets for a time zone may change over time - as countries have changed DST 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 Data Files and Software License. See - \l{Unicode Common Locale Data Repository (CLDR)} for details. - - \sa QDateTime -*/ - -/*! - \enum QTimeZone::anonymous - - Sane UTC offsets range from -14 to +14 hours. - No known zone > 12 hrs West of Greenwich (Baker Island, USA). - No known zone > 14 hrs East of Greenwich (Kiritimati, Christmas Island, Kiribati). - - \value MinUtcOffsetSecs - -14 * 3600, - - \value MaxUtcOffsetSecs - +14 * 3600 -*/ - -/*! - \enum QTimeZone::TimeType - - The type of time zone time, for example when requesting the name. In time - zones that do not apply DST, all three values may return the same result. - - \value StandardTime - The standard time in a time zone, i.e. when Daylight-Saving 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-Saving is in effect. - For example when formatting a display name this will show something - like "Pacific daylight-saving time". - \value GenericTime - A time which is not specifically Standard or Daylight-Saving 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 DST 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 DST 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 - - Synonym for QVector. -*/ - -/*! - Create a null/invalid time zone instance. -*/ - -QTimeZone::QTimeZone() noexcept - : d(0) -{ -} - -/*! - Creates an instance of the requested time zone \a ianaId. - - The ID must be one of the available system IDs otherwise an invalid - time zone will be returned. - - \sa availableTimeZoneIds() -*/ - -QTimeZone::QTimeZone(const QByteArray &ianaId) -{ - // Try and see if it's a valid UTC offset ID, just as quick to try create as look-up - d = new QUtcTimeZonePrivate(ianaId); - // 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(ianaId); -} - -/*! - 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) - : d((offsetSeconds >= MinUtcOffsetSecs && offsetSeconds <= MaxUtcOffsetSecs) - ? new QUtcTimeZonePrivate(offsetSeconds) : nullptr) -{ -} - -/*! - Creates a custom time zone with an ID of \a ianaId 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 ianaId 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 &ianaId, int offsetSeconds, const QString &name, - const QString &abbreviation, QLocale::Country country, const QString &comment) - : d() -{ - if (!isTimeZoneIdAvailable(ianaId)) - d = new QUtcTimeZonePrivate(ianaId, offsetSeconds, name, abbreviation, country, comment); -} - -/*! - \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() -{ -} - -/*! - \fn QTimeZone::swap(QTimeZone &other) - - Swaps this time zone instance with \a other. This function is very - fast and never fails. -*/ - -/*! - Assignment operator, assign \a other to this. -*/ - -QTimeZone &QTimeZone::operator=(const QTimeZone &other) -{ - d = other.d; - return *this; -} - -/* - \fn void QTimeZone::swap(QTimeZone &other) - - Swaps this timezone with \a other. This function is very fast and - never fails. -*/ - -/*! - \fn QTimeZone &QTimeZone::operator=(QTimeZone &&other) - - Move-assigns \a other to this QTimeZone instance, transferring the - ownership of the managed pointer to this instance. -*/ - -/*! - Returns \c 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 \c 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 \c true if this time zone is valid. -*/ - -bool QTimeZone::isValid() const -{ - if (d) - return d->isValid(); - else - return false; -} - -/*! - Returns the IANA ID for the time zone. - - IANA IDs are used on all platforms. On Windows these are translated - from the Windows ID into the closest IANA 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 DST 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 DST 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 DST 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 DST offset is +3600 seconds. During standard time - offsetFromUtc() will return +3600 (UTC+01:00), and during DST 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 DST 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 DST 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-saving 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-saving time. - - For example, for the time zone "Europe/Berlin" the DST offset is +3600 - seconds. During standard time daylightTimeOffset() will return 0, and when - daylight-saving is in effect 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 \c true if the time zone has practiced daylight-saving at any time. - - \sa isDaylightTime(), daylightTimeOffset() -*/ - -bool QTimeZone::hasDaylightTime() const -{ - if (isValid()) - return d->hasDaylightTime(); - else - return false; -} - -/*! - Returns \c true if daylight-saving was in effect at the given \a atDateTime. - - \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 QTimeZonePrivate::toOffsetData(d->data(forDateTime.toMSecsSinceEpoch())); - else - return QTimeZonePrivate::invalidOffsetData(); -} - -/*! - Returns \c true if the system backend supports obtaining transitions. - - Transitions are changes in the time-zone: these happen when DST turns on or - off and when authorities alter the offsets for the time-zone. - - \sa nextTransition(), previousTransition(), 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. - - If there is no transition after the given \a afterDateTime then an invalid - OffsetData will be returned with an invalid QDateTime. - - The given \a afterDateTime is exclusive. - - \sa hasTransitions(), previousTransition(), transitions() -*/ - -QTimeZone::OffsetData QTimeZone::nextTransition(const QDateTime &afterDateTime) const -{ - if (hasTransitions()) - return QTimeZonePrivate::toOffsetData(d->nextTransition(afterDateTime.toMSecsSinceEpoch())); - else - return QTimeZonePrivate::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. - - If there is no transition before the given \a beforeDateTime then an invalid - OffsetData will be returned with an invalid QDateTime. - - The given \a beforeDateTime is exclusive. - - \sa hasTransitions(), nextTransition(), transitions() -*/ - -QTimeZone::OffsetData QTimeZone::previousTransition(const QDateTime &beforeDateTime) const -{ - if (hasTransitions()) - return QTimeZonePrivate::toOffsetData(d->previousTransition(beforeDateTime.toMSecsSinceEpoch())); - else - return QTimeZonePrivate::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()) { - const QTimeZonePrivate::DataList plist = d->transitions(fromDateTime.toMSecsSinceEpoch(), - toDateTime.toMSecsSinceEpoch()); - list.reserve(plist.count()); - for (const QTimeZonePrivate::Data &pdata : plist) - list.append(QTimeZonePrivate::toOffsetData(pdata)); - } - return list; -} - -// Static methods - -/*! - Returns the current system time zone IANA ID. - - On Windows this ID is translated from 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(); -} - -/*! - \since 5.5 - Returns a QTimeZone object that refers to the local system time, as - specified by systemTimeZoneId(). - - \sa utc() -*/ -QTimeZone QTimeZone::systemTimeZone() -{ - return QTimeZone(QTimeZone::systemTimeZoneId()); -} - -/*! - \since 5.5 - Returns a QTimeZone object that refers to UTC (Universal Time Coordinated). - - \sa systemTimeZone() -*/ -QTimeZone QTimeZone::utc() -{ - return QTimeZone(QTimeZonePrivate::utcQByteArray()); -} - -/*! - Returns \c true if a given time zone \a ianaId is available on this system. - - \sa availableTimeZoneIds() -*/ - -bool QTimeZone::isTimeZoneIdAvailable(const QByteArray &ianaId) -{ - // isValidId is not strictly required, but faster to weed out invalid - // IDs as availableTimeZoneIds() may be slow - if (!QTimeZonePrivate::isValidId(ianaId)) - return false; - return QUtcTimeZonePrivate().isTimeZoneIdAvailable(ianaId) || - global_tz->backend->isTimeZoneIdAvailable(ianaId); -} - -static QList set_union(const QList &l1, const QList &l2) -{ - QList result; - result.reserve(l1.size() + l2.size()); - std::set_union(l1.begin(), l1.end(), - l2.begin(), l2.end(), - std::back_inserter(result)); - return result; -} - -/*! - Returns a list of all available IANA time zone IDs on this system. - - \sa isTimeZoneIdAvailable() -*/ - -QList QTimeZone::availableTimeZoneIds() -{ - return set_union(QUtcTimeZonePrivate().availableTimeZoneIds(), - global_tz->backend->availableTimeZoneIds()); -} - -/*! - Returns a list of all available IANA 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 QTimeZone::availableTimeZoneIds(QLocale::Country country) -{ - return set_union(QUtcTimeZonePrivate().availableTimeZoneIds(country), - global_tz->backend->availableTimeZoneIds(country)); -} - -/*! - Returns a list of all available IANA time zone IDs with a given standard - time offset of \a offsetSeconds. - - \sa isTimeZoneIdAvailable() -*/ - -QList QTimeZone::availableTimeZoneIds(int offsetSeconds) -{ - return set_union(QUtcTimeZonePrivate().availableTimeZoneIds(offsetSeconds), - global_tz->backend->availableTimeZoneIds(offsetSeconds)); -} - -/*! - Returns the Windows ID equivalent to the given \a ianaId. - - \sa windowsIdToDefaultIanaId(), windowsIdToIanaIds() -*/ - -QByteArray QTimeZone::ianaIdToWindowsId(const QByteArray &ianaId) -{ - return QTimeZonePrivate::ianaIdToWindowsId(ianaId); -} - -/*! - Returns the default IANA ID for a given \a windowsId. - - Because a Windows ID can cover several IANA IDs in several different - countries, this function returns the most frequently used IANA 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 ianaIdToWindowsId(), windowsIdToIanaIds() -*/ - -QByteArray QTimeZone::windowsIdToDefaultIanaId(const QByteArray &windowsId) -{ - return QTimeZonePrivate::windowsIdToDefaultIanaId(windowsId); -} - -/*! - Returns the default IANA ID for a given \a windowsId and \a country. - - Because a Windows ID can cover several IANA IDs within a given country, - the most frequently used IANA ID in that country is returned. - - As a special case, QLocale::AnyCountry returns the default of those IANA IDs - that do not have any specific country. - - \sa ianaIdToWindowsId(), windowsIdToIanaIds() -*/ - -QByteArray QTimeZone::windowsIdToDefaultIanaId(const QByteArray &windowsId, - QLocale::Country country) -{ - return QTimeZonePrivate::windowsIdToDefaultIanaId(windowsId, country); -} - -/*! - Returns all the IANA IDs for a given \a windowsId. - - The returned list is sorted alphabetically. - - \sa ianaIdToWindowsId(), windowsIdToDefaultIanaId() -*/ - -QList QTimeZone::windowsIdToIanaIds(const QByteArray &windowsId) -{ - return QTimeZonePrivate::windowsIdToIanaIds(windowsId); -} - -/*! - Returns all the IANA IDs for a given \a windowsId and \a country. - - As a special case QLocale::AnyCountry returns those IANA 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 ianaIdToWindowsId(), windowsIdToDefaultIanaId() -*/ - -QList QTimeZone::windowsIdToIanaIds(const QByteArray &windowsId, - QLocale::Country country) -{ - return QTimeZonePrivate::windowsIdToIanaIds(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 ianaId; - ds >> ianaId; - if (ianaId == QLatin1String("OffsetFromUtc")) { - int utcOffset; - QString name; - QString abbreviation; - int country; - QString comment; - ds >> ianaId >> utcOffset >> name >> abbreviation >> country >> comment; - // Try creating as a system timezone, which succeeds (producing a valid - // zone) iff ianaId is valid; we can then ignore the other data. - tz = QTimeZone(ianaId.toUtf8()); - // If not, then construct a custom timezone using all the saved values: - if (!tz.isValid()) - tz = QTimeZone(ianaId.toUtf8(), utcOffset, name, abbreviation, - QLocale::Country(country), comment); - } else { - tz = QTimeZone(ianaId.toUtf8()); - } - return ds; -} -#endif // QT_NO_DATASTREAM - -#ifndef QT_NO_DEBUG_STREAM -QDebug operator<<(QDebug dbg, const QTimeZone &tz) -{ - QDebugStateSaver saver(dbg); - //TODO Include backend and data version details? - dbg.nospace() << "QTimeZone(" << QString::fromUtf8(tz.id()) << ')'; - return dbg; -} -#endif - -QT_END_NAMESPACE diff --git a/src/corelib/tools/qtimezone.h b/src/corelib/tools/qtimezone.h deleted file mode 100644 index 62ecee49bb..0000000000 --- a/src/corelib/tools/qtimezone.h +++ /dev/null @@ -1,188 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 John Layt -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#ifndef QTIMEZONE_H -#define QTIMEZONE_H - -#include -#include -#include - -QT_REQUIRE_CONFIG(timezone); - -#if (defined(Q_OS_DARWIN) || defined(Q_QDOC)) && !defined(QT_NO_SYSTEMLOCALE) -Q_FORWARD_DECLARE_CF_TYPE(CFTimeZone); -Q_FORWARD_DECLARE_OBJC_CLASS(NSTimeZone); -#endif - -QT_BEGIN_NAMESPACE - -class QTimeZonePrivate; - -class Q_CORE_EXPORT QTimeZone -{ -public: - // Sane UTC offsets range from -14 to +14 hours: - enum { - // No known zone > 12 hrs West of Greenwich (Baker Island, USA) - MinUtcOffsetSecs = -14 * 3600, - // No known zone > 14 hrs East of Greenwich (Kiritimati, Christmas Island, Kiribati) - MaxUtcOffsetSecs = +14 * 3600 - }; - - 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 OffsetDataList; - - QTimeZone() noexcept; - explicit QTimeZone(const QByteArray &ianaId); - explicit QTimeZone(int offsetSeconds); - /*implicit*/ 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); - QTimeZone &operator=(QTimeZone &&other) noexcept { swap(other); return *this; } - - void swap(QTimeZone &other) noexcept - { d.swap(other.d); } - - 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 QTimeZone systemTimeZone(); - static QTimeZone utc(); - - static bool isTimeZoneIdAvailable(const QByteArray &ianaId); - - static QList availableTimeZoneIds(); - static QList availableTimeZoneIds(QLocale::Country country); - static QList availableTimeZoneIds(int offsetSeconds); - - static QByteArray ianaIdToWindowsId(const QByteArray &ianaId); - static QByteArray windowsIdToDefaultIanaId(const QByteArray &windowsId); - static QByteArray windowsIdToDefaultIanaId(const QByteArray &windowsId, - QLocale::Country country); - static QList windowsIdToIanaIds(const QByteArray &windowsId); - static QList windowsIdToIanaIds(const QByteArray &windowsId, - QLocale::Country country); - -#if (defined(Q_OS_DARWIN) || defined(Q_QDOC)) && !defined(QT_NO_SYSTEMLOCALE) - static QTimeZone fromCFTimeZone(CFTimeZoneRef timeZone); - CFTimeZoneRef toCFTimeZone() const Q_DECL_CF_RETURNS_RETAINED; - static QTimeZone fromNSTimeZone(const NSTimeZone *timeZone); - NSTimeZone *toNSTimeZone() const Q_DECL_NS_RETURNS_AUTORELEASED; -#endif - -private: - QTimeZone(QTimeZonePrivate &dd); -#ifndef QT_NO_DATASTREAM - friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &ds, const QTimeZone &tz); -#endif - friend class QTimeZonePrivate; - friend class QDateTime; - friend class QDateTimePrivate; - QSharedDataPointer d; -}; - -Q_DECLARE_TYPEINFO(QTimeZone::OffsetData, Q_MOVABLE_TYPE); -Q_DECLARE_SHARED(QTimeZone) - -#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 deleted file mode 100644 index 569b343187..0000000000 --- a/src/corelib/tools/qtimezoneprivate.cpp +++ /dev/null @@ -1,926 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 John Layt -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include "qtimezone.h" -#include "qtimezoneprivate_p.h" -#include "qtimezoneprivate_data_p.h" - -#include -#include - -#include - -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 IANA ID literal for a given QWindowsData -static QByteArray ianaId(const QWindowsData *windowsData) -{ - return (ianaIdData + windowsData->ianaIdIndex); -} - -// Return the IANA ID literal for a given QZoneData -static QByteArray ianaId(const QZoneData *zoneData) -{ - return (ianaIdData + zoneData->ianaIdIndex); -} - -static QByteArray utcId(const QUtcData *utcData) -{ - return (ianaIdData + utcData->ianaIdIndex); -} - -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() const -{ - 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 (ianaId(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(); -} - -// Private only method for use by QDateTime to convert local msecs to epoch msecs -QTimeZonePrivate::Data QTimeZonePrivate::dataForLocalTime(qint64 forLocalMSecs, int hint) const -{ - if (!hasDaylightTime()) // No DST means same offset for all local msecs - return data(forLocalMSecs - standardTimeOffset(forLocalMSecs) * 1000); - - /* - We need a UTC time at which to ask for the offset, in order to be able to - add that offset to forLocalMSecs, to get the UTC time we - need. Fortunately, no time-zone offset is more than 14 hours; and DST - transitions happen (much) more than thirty-two hours apart. So sampling - offset sixteen hours each side gives us information we can be sure - brackets the correct time and at most one DST transition. - */ - const qint64 sixteenHoursInMSecs(16 * 3600 * 1000); - Q_STATIC_ASSERT(-sixteenHoursInMSecs / 1000 < QTimeZone::MinUtcOffsetSecs - && sixteenHoursInMSecs / 1000 > QTimeZone::MaxUtcOffsetSecs); - const qint64 recent = forLocalMSecs - sixteenHoursInMSecs; - const qint64 imminent = forLocalMSecs + sixteenHoursInMSecs; - /* - Offsets are Local - UTC, positive to the east of Greenwich, negative to - the west; DST offset always exceeds standard offset, when DST applies. - When we have offsets on either side of a transition, the lower one is - standard, the higher is DST. - - Non-DST transitions (jurisdictions changing time-zone and time-zones - changing their standard offset, typically) are described below as if they - were DST transitions (since these are more usual and familiar); the code - mostly concerns itself with offsets from UTC, described in terms of the - common case for changes in that. If there is no actual change in offset - (e.g. a DST transition cancelled by a standard offset change), this code - should handle it gracefully; without transitions, it'll see early == late - and take the easy path; with transitions, tran and nextTran get the - correct UTC time as atMSecsSinceEpoch so comparing to nextStart selects - the right one. In all other cases, the transition changes offset and the - reasoning that applies to DST applies just the same. Aside from hinting, - the only thing that looks at DST-ness at all, other than inferred from - offset changes, is the case without transition data handling an invalid - time in the gap that a transition passed over. - - The handling of hint (see below) is apt to go wrong in non-DST - transitions. There isn't really a great deal we can hope to do about that - without adding yet more unreliable complexity to the heuristics in use for - already obscure corner-cases. - */ - - /* - The hint (really a QDateTimePrivate::DaylightStatus) is > 0 if caller - thinks we're in DST, 0 if in standard. A value of -2 means never-DST, so - should have been handled above; if it slips through, it's wrong but we - should probably treat it as standard anyway (never-DST means - always-standard, after all). If the hint turns out to be wrong, fall back - on trying the other possibility: which makes it harmless to treat -1 - (meaning unknown) as standard (i.e. try standard first, then try DST). In - practice, away from a transition, the only difference hint makes is to - which candidate we try first: if the hint is wrong (or unknown and - standard fails), we'll try the other candidate and it'll work. - - For the obscure (and invalid) case where forLocalMSecs falls in a - spring-forward's missing hour, a common case is that we started with a - date/time for which the hint was valid and adjusted it naively; for that - case, we should correct the adjustment by shunting across the transition - into where hint is wrong. So half-way through the gap, arrived at from - the DST side, should be read as an hour earlier, in standard time; but, if - arrived at from the standard side, should be read as an hour later, in - DST. (This shall be wrong in some cases; for example, when a country - changes its transition dates and changing a date/time by more than six - months lands it on a transition. However, these cases are even more - obscure than those where the heuristic is good.) - */ - - if (hasTransitions()) { - /* - We have transitions. - - Each transition gives the offsets to use until the next; so we need the - most recent transition before the time forLocalMSecs describes. If it - describes a time *in* a transition, we'll need both that transition and - the one before it. So find one transition that's probably after (and not - much before, otherwise) and another that's definitely before, then work - out which one to use. When both or neither work on forLocalMSecs, use - hint to disambiguate. - */ - - // Get a transition definitely before the local MSecs; usually all we need. - // Only around the transition times might we need another. - Data tran = previousTransition(recent); - Q_ASSERT(forLocalMSecs < 0 || // Pre-epoch TZ info may be unavailable - forLocalMSecs - tran.offsetFromUtc * 1000 >= tran.atMSecsSinceEpoch); - Data nextTran = nextTransition(tran.atMSecsSinceEpoch); - /* - Now walk those forward until they bracket forLocalMSecs with transitions. - - One of the transitions should then be telling us the right offset to use. - In a transition, we need the transition before it (to describe the run-up - to the transition) and the transition itself; so we need to stop when - nextTran is that transition. - */ - while (nextTran.atMSecsSinceEpoch != invalidMSecs() - && forLocalMSecs > nextTran.atMSecsSinceEpoch + nextTran.offsetFromUtc * 1000) { - Data newTran = nextTransition(nextTran.atMSecsSinceEpoch); - if (newTran.atMSecsSinceEpoch == invalidMSecs() - || newTran.atMSecsSinceEpoch + newTran.offsetFromUtc * 1000 > imminent) { - // Definitely not a relevant tansition: too far in the future. - break; - } - tran = nextTran; - nextTran = newTran; - } - - // Check we do *really* have transitions for this zone: - if (tran.atMSecsSinceEpoch != invalidMSecs()) { - - /* - So now tran is definitely before and nextTran is either after or only - slightly before. One is standard time; we interpret the other as DST - (although the transition might in fact by a change in standard offset). Our - hint tells us which of those to use (defaulting to standard if no hint): try - it first; if that fails, try the other; if both fail, life's tricky. - */ - Q_ASSERT(forLocalMSecs < 0 - || forLocalMSecs - tran.offsetFromUtc * 1000 > tran.atMSecsSinceEpoch); - const qint64 nextStart = nextTran.atMSecsSinceEpoch; - // Work out the UTC values it might make sense to return: - nextTran.atMSecsSinceEpoch = forLocalMSecs - nextTran.offsetFromUtc * 1000; - tran.atMSecsSinceEpoch = forLocalMSecs - tran.offsetFromUtc * 1000; - - // If both or neither have zero DST, treat the one with lower offset as standard: - const bool nextIsDst = !nextTran.daylightTimeOffset == !tran.daylightTimeOffset - ? tran.offsetFromUtc < nextTran.offsetFromUtc : nextTran.daylightTimeOffset; - // If that agrees with hint > 0, our first guess is to use nextTran; else tran. - const bool nextFirst = nextIsDst == (hint > 0) && nextStart != invalidMSecs(); - for (int i = 0; i < 2; i++) { - /* - On the first pass, the case we consider is what hint told us to expect - (except when hint was -1 and didn't actually tell us what to expect), - so it's likely right. We only get a second pass if the first failed, - by which time the second case, that we're trying, is likely right. If - an overwhelming majority of calls have hint == -1, the Q_LIKELY here - shall be wrong half the time; otherwise, its errors shall be rarer - than that. - */ - if (nextFirst ? i == 0 : i) { - Q_ASSERT(nextStart != invalidMSecs()); - if (Q_LIKELY(nextStart <= nextTran.atMSecsSinceEpoch)) - return nextTran; - } else { - // If next is invalid, nextFirst is false, to route us here first: - if (nextStart == invalidMSecs() || Q_LIKELY(nextStart > tran.atMSecsSinceEpoch)) - return tran; - } - } - - /* - Neither is valid (e.g. in a spring-forward's gap) and - nextTran.atMSecsSinceEpoch < nextStart <= tran.atMSecsSinceEpoch, so - 0 < tran.atMSecsSinceEpoch - nextTran.atMSecsSinceEpoch - = (nextTran.offsetFromUtc - tran.offsetFromUtc) * 1000 - */ - int dstStep = (nextTran.offsetFromUtc - tran.offsetFromUtc) * 1000; - Q_ASSERT(dstStep > 0); // How else could we get here ? - if (nextFirst) { // hint thought we needed nextTran, so use tran - tran.atMSecsSinceEpoch -= dstStep; - return tran; - } - nextTran.atMSecsSinceEpoch += dstStep; - return nextTran; - } - // System has transitions but not for this zone. - // Try falling back to offsetFromUtc - } - - /* Bracket and refine to discover offset. */ - qint64 utcEpochMSecs; - - int early = offsetFromUtc(recent); - int late = offsetFromUtc(imminent); - if (Q_LIKELY(early == late)) { // > 99% of the time - utcEpochMSecs = forLocalMSecs - early * 1000; - } else { - // Close to a DST transition: early > late is near a fall-back, - // early < late is near a spring-forward. - const int offsetInDst = qMax(early, late); - const int offsetInStd = qMin(early, late); - // Candidate values for utcEpochMSecs (if forLocalMSecs is valid): - const qint64 forDst = forLocalMSecs - offsetInDst * 1000; - const qint64 forStd = forLocalMSecs - offsetInStd * 1000; - // Best guess at the answer: - const qint64 hinted = hint > 0 ? forDst : forStd; - if (Q_LIKELY(offsetFromUtc(hinted) == (hint > 0 ? offsetInDst : offsetInStd))) { - utcEpochMSecs = hinted; - } else if (hint <= 0 && offsetFromUtc(forDst) == offsetInDst) { - utcEpochMSecs = forDst; - } else if (hint > 0 && offsetFromUtc(forStd) == offsetInStd) { - utcEpochMSecs = forStd; - } else { - // Invalid forLocalMSecs: in spring-forward gap. - const int dstStep = daylightTimeOffset(early < late ? imminent : recent) * 1000; - Q_ASSERT(dstStep); // There can't be a transition without it ! - utcEpochMSecs = (hint > 0) ? forStd - dstStep : forDst + dstStep; - } - } - - return data(utcEpochMSecs); -} - -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 != invalidMSecs() - && next.atMSecsSinceEpoch <= toMSecsSinceEpoch) { - list.append(next); - next = nextTransition(next.atMSecsSinceEpoch); - } - } - return list; -} - -QByteArray QTimeZonePrivate::systemTimeZoneId() const -{ - return QByteArray(); -} - -bool QTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray& ianaId) const -{ - // Fall-back implementation, can be made faster in subclasses - const QList tzIds = availableTimeZoneIds(); - return std::binary_search(tzIds.begin(), tzIds.end(), ianaId); -} - -QList QTimeZonePrivate::availableTimeZoneIds() const -{ - return QList(); -} - -QList QTimeZonePrivate::availableTimeZoneIds(QLocale::Country country) const -{ - // Default fall-back mode, use the zoneTable to find Region of know Zones - QList regions; - - // First get all Zones in the Zones table belonging to the Region - for (int i = 0; i < zoneDataTableSize; ++i) { - if (zoneData(i)->country == country) - regions += ianaId(zoneData(i)).split(' '); - } - - std::sort(regions.begin(), regions.end()); - regions.erase(std::unique(regions.begin(), regions.end()), regions.end()); - - // Then select just those that are available - const QList all = availableTimeZoneIds(); - QList result; - result.reserve(qMin(all.size(), regions.size())); - std::set_intersection(all.begin(), all.end(), regions.cbegin(), regions.cend(), - std::back_inserter(result)); - return result; -} - -QList QTimeZonePrivate::availableTimeZoneIds(int offsetFromUtc) const -{ - // Default fall-back mode, use the zoneTable to find Offset of know Zones - QList offsets; - // 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) - offsets += ianaId(data).split(' '); - } - } - } - - std::sort(offsets.begin(), offsets.end()); - offsets.erase(std::unique(offsets.begin(), offsets.end()), offsets.end()); - - // Then select just those that are available - const QList all = availableTimeZoneIds(); - QList result; - result.reserve(qMin(all.size(), offsets.size())); - std::set_intersection(all.begin(), all.end(), offsets.cbegin(), offsets.cend(), - std::back_inserter(result)); - return result; -} - -#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; -} - -// Is the format of the ID valid ? -bool QTimeZonePrivate::isValidId(const QByteArray &ianaId) -{ - /* - Main rules for defining TZ/IANA names as per ftp://ftp.iana.org/tz/code/Theory - 1. Use only valid POSIX file name components - 2. Within a file name component, use only ASCII letters, `.', `-' and `_'. - 3. Do not use digits (except in a [+-]\d+ suffix, when used). - 4. A file name component must not exceed 14 characters or start with `-' - However, the rules are really guidelines - a later one says - - Do not change established names if they only marginally violate the - above rules. - We may, therefore, need to be a bit slack in our check here, if we hit - legitimate exceptions in real time-zone databases. - - In particular, aliases such as "Etc/GMT+7" and "SystemV/EST5EDT" are valid - so we need to accept digits, ':', and '+'; aliases typically have the form - of POSIX TZ strings, which allow a suffix to a proper IANA name. A POSIX - suffix starts with an offset (as in GMT+7) and may continue with another - name (as in EST5EDT, giving the DST name of the zone); a further offset is - allowed (for DST). The ("hard to describe and [...] error-prone in - practice") POSIX form even allows a suffix giving the dates (and - optionally times) of the annual DST transitions. Hopefully, no TZ aliases - go that far, but we at least need to accept an offset and (single - fragment) DST-name. - - But for the legacy complications, the following would be preferable if - QRegExp would work on QByteArrays directly: - const QRegExp rx(QStringLiteral("[a-z+._][a-z+._-]{,13}" - "(?:/[a-z+._][a-z+._-]{,13})*" - // Optional suffix: - "(?:[+-]?\d{1,2}(?::\d{1,2}){,2}" // offset - // one name fragment (DST): - "(?:[a-z+._][a-z+._-]{,13})?)"), - Qt::CaseInsensitive); - return rx.exactMatch(ianaId); - */ - - // Somewhat slack hand-rolled version: - const int MinSectionLength = 1; - const int MaxSectionLength = 14; - int sectionLength = 0; - for (const char *it = ianaId.begin(), * const end = ianaId.end(); it != end; ++it, ++sectionLength) { - const char ch = *it; - if (ch == '/') { - if (sectionLength < MinSectionLength || sectionLength > MaxSectionLength) - return false; // violates (4) - sectionLength = -1; - } else if (ch == '-') { - if (sectionLength == 0) - return false; // violates (4) - } else if (!(ch >= 'a' && ch <= 'z') - && !(ch >= 'A' && ch <= 'Z') - && !(ch == '_') - && !(ch == '.') - // Should ideally check these only happen as an offset: - && !(ch >= '0' && ch <= '9') - && !(ch == '+') - && !(ch == ':')) { - return false; // violates (2) - } - } - if (sectionLength < MinSectionLength || sectionLength > MaxSectionLength) - return false; // violates (4) - 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::ianaIdToWindowsId(const QByteArray &id) -{ - for (int i = 0; i < zoneDataTableSize; ++i) { - const QZoneData *data = zoneData(i); - if (ianaId(data).split(' ').contains(id)) - return toWindowsIdLiteral(data->windowsIdKey); - } - return QByteArray(); -} - -QByteArray QTimeZonePrivate::windowsIdToDefaultIanaId(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 ianaId(data); - } - return QByteArray(); -} - -QByteArray QTimeZonePrivate::windowsIdToDefaultIanaId(const QByteArray &windowsId, - QLocale::Country country) -{ - const QList list = windowsIdToIanaIds(windowsId, country); - if (list.count() > 0) - return list.first(); - else - return QByteArray(); -} - -QList QTimeZonePrivate::windowsIdToIanaIds(const QByteArray &windowsId) -{ - const quint16 windowsIdKey = toWindowsIdKey(windowsId); - QList list; - - for (int i = 0; i < zoneDataTableSize; ++i) { - const QZoneData *data = zoneData(i); - if (data->windowsIdKey == windowsIdKey) - list << ianaId(data).split(' '); - } - - // Return the full list in alpha order - std::sort(list.begin(), list.end()); - return list; -} - -QList QTimeZonePrivate::windowsIdToIanaIds(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 ianaId(data).split(' '); - } - - return QList(); -} - -// Define template for derived classes to reimplement so QSharedDataPointer clone() works correctly -template<> QTimeZonePrivate *QSharedDataPointer::clone() -{ - return d->clone(); -} - -/* - UTC Offset implementation, used when QT_NO_SYSTEMLOCALE set and ICU is not being used, - or for QDateTimes with a Qt:Spec of Qt::OffsetFromUtc. -*/ - -// Create default UTC time zone -QUtcTimeZonePrivate::QUtcTimeZonePrivate() -{ - const QString name = utcQString(); - init(utcQByteArray(), 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 = utcQString(); - 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_name(other.m_name), - m_abbreviation(other.m_abbreviation), - m_comment(other.m_comment), - m_country(other.m_country), - m_offsetFromUtc(other.m_offsetFromUtc) -{ -} - -QUtcTimeZonePrivate::~QUtcTimeZonePrivate() -{ -} - -QUtcTimeZonePrivate *QUtcTimeZonePrivate::clone() const -{ - return new QUtcTimeZonePrivate(*this); -} - -QTimeZonePrivate::Data QUtcTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const -{ - Data d; - d.abbreviation = m_abbreviation; - d.atMSecsSinceEpoch = forMSecsSinceEpoch; - d.standardTimeOffset = d.offsetFromUtc = m_offsetFromUtc; - d.daylightTimeOffset = 0; - return d; -} - -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 utcQByteArray(); -} - -bool QUtcTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const -{ - for (int i = 0; i < utcDataTableSize; ++i) { - const QUtcData *data = utcData(i); - if (utcId(data) == ianaId) { - return true; - } - } - return false; -} - -QList QUtcTimeZonePrivate::availableTimeZoneIds() const -{ - QList result; - result.reserve(utcDataTableSize); - for (int i = 0; i < utcDataTableSize; ++i) - result << utcId(utcData(i)); - std::sort(result.begin(), result.end()); // ### or already sorted?? - // ### assuming no duplicates - return result; -} - -QList QUtcTimeZonePrivate::availableTimeZoneIds(QLocale::Country country) const -{ - // If AnyCountry then is request for all non-region offset codes - if (country == QLocale::AnyCountry) - return availableTimeZoneIds(); - return QList(); -} - -QList QUtcTimeZonePrivate::availableTimeZoneIds(qint32 offsetSeconds) const -{ - QList result; - for (int i = 0; i < utcDataTableSize; ++i) { - const QUtcData *data = utcData(i); - if (data->offsetFromUtc == offsetSeconds) - result << utcId(data); - } - std::sort(result.begin(), result.end()); // ### or already sorted?? - // ### assuming no duplicates - return result; -} - -#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_android.cpp b/src/corelib/tools/qtimezoneprivate_android.cpp deleted file mode 100644 index be4f374fdd..0000000000 --- a/src/corelib/tools/qtimezoneprivate_android.cpp +++ /dev/null @@ -1,257 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Drew Parsons -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include "qtimezone.h" -#include "qtimezoneprivate_p.h" - -QT_BEGIN_NAMESPACE - -/* - Private - - Android implementation -*/ - -// Create the system default time zone -QAndroidTimeZonePrivate::QAndroidTimeZonePrivate() - : QTimeZonePrivate() -{ - // start with system time zone - androidTimeZone = QJNIObjectPrivate::callStaticObjectMethod("java.util.TimeZone", "getDefault", "()Ljava/util/TimeZone;"); - init("UTC"); -} - -// Create a named time zone -QAndroidTimeZonePrivate::QAndroidTimeZonePrivate(const QByteArray &ianaId) - : QTimeZonePrivate() -{ - init(ianaId); -} - -QAndroidTimeZonePrivate::QAndroidTimeZonePrivate(const QAndroidTimeZonePrivate &other) - : QTimeZonePrivate(other) -{ - androidTimeZone = other.androidTimeZone; - m_id = other.id(); -} - -QAndroidTimeZonePrivate::~QAndroidTimeZonePrivate() -{ -} - - -void QAndroidTimeZonePrivate::init(const QByteArray &ianaId) -{ - QJNIObjectPrivate jo_ianaId = QJNIObjectPrivate::fromString( QString::fromUtf8(ianaId) ); - androidTimeZone = QJNIObjectPrivate::callStaticObjectMethod( "java.util.TimeZone", "getTimeZone", "(Ljava/lang/String;)Ljava/util/TimeZone;", static_cast(jo_ianaId.object()) ); - - // Painfully, JNI gives us back a default zone object if it doesn't - // recognize the name; so check for whether ianaId is a recognized name of - // the zone object we got and ignore the zone if not. - // Try checking ianaId against getID(), getDisplayName(): - QJNIObjectPrivate jname = androidTimeZone.callObjectMethod("getID", "()Ljava/lang/String;"); - bool found = (jname.toString().toUtf8() == ianaId); - for (int style = 1; !found && style-- > 0;) { - for (int dst = 1; !found && dst-- > 0;) { - jname = androidTimeZone.callObjectMethod("getDisplayName", "(ZI;)Ljava/lang/String;", - bool(dst), style); - found = (jname.toString().toUtf8() == ianaId); - } - } - - if (!found) - m_id.clear(); - else if (ianaId.isEmpty()) - m_id = systemTimeZoneId(); - else - m_id = ianaId; -} - -QAndroidTimeZonePrivate *QAndroidTimeZonePrivate::clone() const -{ - return new QAndroidTimeZonePrivate(*this); -} - - -QString QAndroidTimeZonePrivate::displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType, - const QLocale &locale) const -{ - QString name; - - if (androidTimeZone.isValid()) { - jboolean daylightTime = (timeType == QTimeZone::DaylightTime); // treat QTimeZone::GenericTime as QTimeZone::StandardTime - - // treat all NameTypes as java TimeZone style LONG (value 1), except of course QTimeZone::ShortName which is style SHORT (value 0); - jint style = (nameType == QTimeZone::ShortName ? 0 : 1); - - QJNIObjectPrivate jlanguage = QJNIObjectPrivate::fromString(QLocale::languageToString(locale.language())); - QJNIObjectPrivate jcountry = QJNIObjectPrivate::fromString(QLocale::countryToString(locale.country())); - QJNIObjectPrivate jvariant = QJNIObjectPrivate::fromString(QLocale::scriptToString(locale.script())); - QJNIObjectPrivate jlocale("java.util.Locale", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", static_cast(jlanguage.object()), static_cast(jcountry.object()), static_cast(jvariant.object())); - - QJNIObjectPrivate jname = androidTimeZone.callObjectMethod("getDisplayName", "(ZILjava/util/Locale;)Ljava/lang/String;", daylightTime, style, jlocale.object()); - - name = jname.toString(); - } - - return name; -} - -QString QAndroidTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const -{ - if ( isDaylightTime( atMSecsSinceEpoch ) ) - return displayName(QTimeZone::DaylightTime, QTimeZone::ShortName, QLocale() ); - else - return displayName(QTimeZone::StandardTime, QTimeZone::ShortName, QLocale() ); -} - -int QAndroidTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const -{ - // offsetFromUtc( ) is invoked when androidTimeZone may not yet be set at startup, - // so a validity test is needed here - if ( androidTimeZone.isValid() ) - // the java method getOffset() returns milliseconds, but QTimeZone returns seconds - return androidTimeZone.callMethod( "getOffset", "(J)I", static_cast(atMSecsSinceEpoch) ) / 1000; - else - return 0; -} - -int QAndroidTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const -{ - // the java method does not use a reference time - Q_UNUSED( atMSecsSinceEpoch ); - if ( androidTimeZone.isValid() ) - // the java method getRawOffset() returns milliseconds, but QTimeZone returns seconds - return androidTimeZone.callMethod( "getRawOffset" ) / 1000; - else - return 0; -} - -int QAndroidTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const -{ - return ( offsetFromUtc(atMSecsSinceEpoch) - standardTimeOffset(atMSecsSinceEpoch) ); -} - -bool QAndroidTimeZonePrivate::hasDaylightTime() const -{ - if ( androidTimeZone.isValid() ) - /* note: the Java function only tests for future DST transtions, not past */ - return androidTimeZone.callMethod("useDaylightTime" ); - else - return false; -} - -bool QAndroidTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const -{ - if ( androidTimeZone.isValid() ) { - QJNIObjectPrivate jDate( "java/util/Date", "(J)V", static_cast(atMSecsSinceEpoch) ); - return androidTimeZone.callMethod("inDaylightTime", "(Ljava/util/Date;)Z", jDate.object() ); - } - else - return false; -} - -QTimeZonePrivate::Data QAndroidTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const -{ - if (androidTimeZone.isValid()) { - Data data; - data.atMSecsSinceEpoch = forMSecsSinceEpoch; - data.standardTimeOffset = standardTimeOffset(forMSecsSinceEpoch); - data.offsetFromUtc = offsetFromUtc(forMSecsSinceEpoch); - data.daylightTimeOffset = data.offsetFromUtc - data.standardTimeOffset; - data.abbreviation = abbreviation(forMSecsSinceEpoch); - return data; - } else { - return invalidData(); - } -} - -bool QAndroidTimeZonePrivate::hasTransitions() const -{ - // java.util.TimeZone does not directly provide transitions - return false; -} - -QTimeZonePrivate::Data QAndroidTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const -{ - // transitions not available on Android, so return an invalid data object - Q_UNUSED( afterMSecsSinceEpoch ); - return invalidData(); -} - -QTimeZonePrivate::Data QAndroidTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const -{ - // transitions not available on Android, so return an invalid data object - Q_UNUSED( beforeMSecsSinceEpoch ); - return invalidData(); -} - -QByteArray QAndroidTimeZonePrivate::systemTimeZoneId() const -{ - QJNIObjectPrivate androidSystemTimeZone = QJNIObjectPrivate::callStaticObjectMethod("java.util.TimeZone", "getDefault", "()Ljava/util/TimeZone;"); - QJNIObjectPrivate systemTZIdAndroid = androidSystemTimeZone.callObjectMethod("getID"); - QByteArray systemTZid = systemTZIdAndroid.toString().toUtf8(); - - return systemTZid; -} - -QList QAndroidTimeZonePrivate::availableTimeZoneIds() const -{ - QList availableTimeZoneIdList; - QJNIObjectPrivate androidAvailableIdList = QJNIObjectPrivate::callStaticObjectMethod("java.util.TimeZone", "getAvailableIDs", "()[Ljava/lang/String;"); - - QJNIEnvironmentPrivate jniEnv; - int androidTZcount = jniEnv->GetArrayLength( static_cast(androidAvailableIdList.object()) ); - - // need separate jobject and QAndroidJniObject here so that we can delete (DeleteLocalRef) the reference to the jobject - // (or else the JNI reference table fills after 512 entries from GetObjectArrayElement) - jobject androidTZobject; - QJNIObjectPrivate androidTZ; - for (int i=0; iGetObjectArrayElement( static_cast( androidAvailableIdList.object() ), i ); - androidTZ = androidTZobject; - availableTimeZoneIdList.append( androidTZ.toString().toUtf8() ); - jniEnv->DeleteLocalRef(androidTZobject); - } - - return availableTimeZoneIdList; -} - -QT_END_NAMESPACE diff --git a/src/corelib/tools/qtimezoneprivate_data_p.h b/src/corelib/tools/qtimezoneprivate_data_p.h deleted file mode 100644 index 40d6c972c2..0000000000 --- a/src/corelib/tools/qtimezoneprivate_data_p.h +++ /dev/null @@ -1,1257 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 John Layt -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.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. -// - -#include - -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/locale_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 IANA ID's, AnyCountry means No Country - quint16 ianaIdIndex; // All IANA ID's for the Windows ID and Country, space separated -}; - -struct QWindowsData { - quint16 windowsIdKey; // Windows ID Key - quint16 windowsIdIndex; // Windows ID Literal - quint16 ianaIdIndex; // Default IANA ID for the Windows ID - qint32 offsetFromUtc; // Standard Time Offset from UTC, used for quick look-ups -}; - -struct QUtcData { - quint16 ianaIdIndex; // IANA 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 2019-05-28 from the - Common Locale Data Repository v35.1 supplemental/windowsZones.xml file $Revision: 14742 $ - - http://www.unicode.org/cldr/ - - Do not edit this code: run cldr2qtimezone.py on updated (or - edited) CLDR data; see qtbase/util/locale_database/. -*/ - -// Windows ID Key, Country Enum, IANA ID Index -static const QZoneData zoneDataTable[] = { - { 131, 143, 0 }, // W. Mongolia Standard Time / Mongolia - { 124, 112, 10 }, // UTC+12 / Kiribati - { 52, 94, 25 }, // Haiti Standard Time / Haiti - { 32, 44, 48 }, // China Standard Time / China - { 95, 244, 62 }, // SA Western Standard Time / Saint Barthelemy - { 25, 116, 84 }, // Central Asia Standard Time / Kyrgyzstan - { 36, 8, 97 }, // E. Africa Standard Time / Antarctica - { 33, 154, 114 }, // Chatham Islands Standard Time / New Zealand - { 95, 144, 130 }, // SA Western Standard Time / Montserrat - { 37, 13, 149 }, // E. Australia Standard Time / Australia - { 61, 0, 187 }, // Line Islands Standard Time / AnyCountry - { 132, 218, 198 }, // West Asia Standard Time / Turkmenistan - { 122, 30, 212 }, // UTC-02 / Brazil - { 24, 52, 228 }, // Central America Standard Time / Costa Rica - { 36, 67, 247 }, // E. Africa Standard Time / Eritrea - { 128, 8, 261 }, // W. Australia Standard Time / Antarctica - { 101, 101, 278 }, // SE Asia Standard Time / Indonesia - { 93, 8, 306 }, // SA Eastern Standard Time / Antarctica - { 4, 178, 325 }, // Altai Standard Time / Russia - { 95, 256, 338 }, // SA Western Standard Time / Sint Maarten - { 95, 60, 360 }, // SA Western Standard Time / Dominica - { 134, 167, 377 }, // West Pacific Standard Time / Papua New Guinea - { 13, 13, 398 }, // AUS Eastern Standard Time / Australia - { 69, 236, 435 }, // Morocco Standard Time / Western Sahara - { 39, 30, 451 }, // E. South America Standard Time / Brazil - { 124, 134, 469 }, // UTC+12 / Marshall Islands - { 125, 112, 502 }, // UTC+13 / Kiribati - { 103, 146, 520 }, // South Africa Standard Time / Mozambique - { 94, 30, 534 }, // SA Pacific Standard Time / Brazil - { 88, 74, 570 }, // Romance Standard Time / France - { 71, 38, 583 }, // Mountain Standard Time / Canada - { 72, 147, 657 }, // Myanmar Standard Time / Myanmar - { 26, 30, 670 }, // Central Brazilian Standard Time / Brazil - { 130, 123, 706 }, // W. Europe Standard Time / Liechtenstein - { 46, 73, 719 }, // FLE Standard Time / Finland - { 93, 70, 735 }, // SA Eastern Standard Time / Falkland Islands - { 78, 159, 752 }, // Norfolk Standard Time / Norfolk Island - { 53, 0, 768 }, // Hawaiian Standard Time / AnyCountry - { 28, 54, 779 }, // Central European Standard Time / Croatia - { 75, 150, 793 }, // Nepal Standard Time / Nepal - { 46, 33, 807 }, // FLE Standard Time / Bulgaria - { 6, 162, 820 }, // Arabian Standard Time / Oman - { 132, 131, 832 }, // West Asia Standard Time / Maldives - { 88, 197, 848 }, // Romance Standard Time / Spain - { 50, 91, 875 }, // Greenwich Standard Time / Guinea - { 5, 237, 890 }, // Arab Standard Time / Yemen - { 92, 222, 900 }, // Russian Standard Time / Ukraine - { 103, 204, 918 }, // South Africa Standard Time / Swaziland - { 130, 203, 933 }, // W. Europe Standard Time / Svalbard And Jan Mayen Islands - { 7, 103, 953 }, // Arabic Standard Time / Iraq - { 119, 226, 966 }, // UTC-11 / United States Minor Outlying Islands - { 5, 115, 981 }, // Arab Standard Time / Kuwait - { 50, 189, 993 }, // Greenwich Standard Time / Sierra Leone - { 31, 0, 1009 }, // Central Standard Time / AnyCountry - { 53, 51, 1017 }, // Hawaiian Standard Time / Cook Islands - { 129, 50, 1035 }, // W. Central Africa Standard Time / Congo Brazzaville - { 64, 43, 1054 }, // Magallanes Standard Time / Chile - { 119, 0, 1075 }, // UTC-11 / AnyCountry - { 84, 38, 1086 }, // Pacific Standard Time / Canada - { 22, 11, 1138 }, // Caucasus Standard Time / Armenia - { 130, 142, 1151 }, // W. Europe Standard Time / Monaco - { 103, 239, 1165 }, // South Africa Standard Time / Zambia - { 46, 222, 1179 }, // FLE Standard Time / Ukraine - { 87, 168, 1225 }, // Paraguay Standard Time / Paraguay - { 57, 109, 1242 }, // Jordan Standard Time / Jordan - { 109, 30, 1253 }, // Tocantins Standard Time / Brazil - { 55, 102, 1271 }, // Iran Standard Time / Iran - { 101, 8, 1283 }, // SE Asia Standard Time / Antarctica - { 27, 57, 1300 }, // Central Europe Standard Time / Czech Republic - { 95, 215, 1314 }, // SA Western Standard Time / Trinidad And Tobago - { 103, 28, 1336 }, // South Africa Standard Time / Botswana - { 132, 0, 1352 }, // West Asia Standard Time / AnyCountry - { 94, 63, 1362 }, // SA Pacific Standard Time / Ecuador - { 51, 85, 1380 }, // GTB Standard Time / Greece - { 36, 128, 1394 }, // E. Africa Standard Time / Madagascar - { 53, 226, 1414 }, // Hawaiian Standard Time / United States Minor Outlying Islands - { 94, 107, 1431 }, // SA Pacific Standard Time / Jamaica - { 104, 198, 1447 }, // Sri Lanka Standard Time / Sri Lanka - { 27, 243, 1460 }, // Central Europe Standard Time / Serbia - { 25, 110, 1476 }, // Central Asia Standard Time / Kazakhstan - { 125, 0, 1502 }, // UTC+13 / AnyCountry - { 94, 38, 1513 }, // SA Pacific Standard Time / Canada - { 25, 31, 1535 }, // Central Asia Standard Time / British Indian Ocean Territory - { 108, 13, 1549 }, // Tasmania Standard Time / Australia - { 95, 174, 1583 }, // SA Western Standard Time / Puerto Rico - { 95, 180, 1603 }, // SA Western Standard Time / Saint Kitts And Nevis - { 130, 206, 1620 }, // W. Europe Standard Time / Switzerland - { 117, 225, 1634 }, // US Eastern Standard Time / United States - { 29, 140, 1701 }, // Central Pacific Standard Time / Micronesia - { 120, 77, 1731 }, // UTC-09 / French Polynesia - { 129, 156, 1747 }, // W. Central Africa Standard Time / Niger - { 118, 139, 1761 }, // US Mountain Standard Time / Mexico - { 36, 194, 1780 }, // E. Africa Standard Time / Somalia - { 118, 0, 1797 }, // US Mountain Standard Time / AnyCountry - { 10, 24, 1807 }, // Atlantic Standard Time / Bermuda - { 103, 240, 1824 }, // South Africa Standard Time / Zimbabwe - { 32, 126, 1838 }, // China Standard Time / Macau - { 129, 66, 1849 }, // W. Central Africa Standard Time / Equatorial Guinea - { 66, 137, 1863 }, // Mauritius Standard Time / Mauritius - { 46, 68, 1880 }, // FLE Standard Time / Estonia - { 50, 187, 1895 }, // Greenwich Standard Time / Senegal - { 132, 110, 1908 }, // West Asia Standard Time / Kazakhstan - { 25, 44, 1968 }, // Central Asia Standard Time / China - { 130, 106, 1980 }, // W. Europe Standard Time / Italy - { 48, 251, 1992 }, // GMT Standard Time / Isle Of Man - { 36, 210, 2011 }, // E. Africa Standard Time / Tanzania - { 10, 86, 2032 }, // Atlantic Standard Time / Greenland - { 123, 86, 2046 }, // UTC / Greenland - { 20, 38, 2067 }, // Canada Central Standard Time / Canada - { 15, 86, 2104 }, // Azores Standard Time / Greenland - { 69, 145, 2125 }, // Morocco Standard Time / Morocco - { 115, 219, 2143 }, // Turks And Caicos Standard Time / Turks And Caicos Islands - { 50, 80, 2162 }, // Greenwich Standard Time / Gambia - { 129, 42, 2176 }, // W. Central Africa Standard Time / Chad - { 56, 105, 2192 }, // Israel Standard Time / Israel - { 64, 8, 2207 }, // Magallanes Standard Time / Antarctica - { 12, 13, 2225 }, // Aus Central W. Standard Time / Australia - { 24, 155, 2241 }, // Central America Standard Time / Nicaragua - { 102, 170, 2257 }, // Singapore Standard Time / Philippines - { 134, 160, 2269 }, // West Pacific Standard Time / Northern Mariana Islands - { 43, 64, 2284 }, // Egypt Standard Time / Egypt - { 88, 21, 2297 }, // Romance Standard Time / Belgium - { 76, 8, 2313 }, // New Zealand Standard Time / Antarctica - { 51, 177, 2332 }, // GTB Standard Time / Romania - { 103, 0, 2349 }, // South Africa Standard Time / AnyCountry - { 41, 225, 2359 }, // Eastern Standard Time / United States - { 129, 23, 2516 }, // W. Central Africa Standard Time / Benin - { 79, 178, 2534 }, // North Asia East Standard Time / Russia - { 116, 143, 2547 }, // Ulaanbaatar Standard Time / Mongolia - { 130, 14, 2580 }, // W. Europe Standard Time / Austria - { 41, 38, 2594 }, // Eastern Standard Time / Canada - { 95, 255, 2699 }, // SA Western Standard Time / Bonaire - { 124, 149, 2718 }, // UTC+12 / Nauru - { 134, 8, 2732 }, // West Pacific Standard Time / Antarctica - { 63, 178, 2758 }, // Magadan Standard Time / Russia - { 130, 161, 2771 }, // W. Europe Standard Time / Norway - { 110, 0, 2783 }, // Tokyo Standard Time / AnyCountry - { 24, 63, 2793 }, // Central America Standard Time / Ecuador - { 103, 35, 2811 }, // South Africa Standard Time / Burundi - { 10, 38, 2828 }, // Atlantic Standard Time / Canada - { 29, 0, 2896 }, // Central Pacific Standard Time / AnyCountry - { 95, 87, 2907 }, // SA Western Standard Time / Grenada - { 29, 153, 2923 }, // Central Pacific Standard Time / New Caledonia - { 42, 139, 2938 }, // Eastern Standard Time (Mexico) / Mexico - { 2, 225, 2953 }, // Alaskan Standard Time / United States - { 49, 86, 3029 }, // Greenland Standard Time / Greenland - { 50, 92, 3045 }, // Greenwich Standard Time / Guinea Bissau - { 130, 184, 3059 }, // W. Europe Standard Time / San Marino - { 27, 98, 3077 }, // Central Europe Standard Time / Hungary - { 24, 96, 3093 }, // Central America Standard Time / Honduras - { 62, 13, 3113 }, // Lord Howe Standard Time / Australia - { 36, 0, 3133 }, // E. Africa Standard Time / AnyCountry - { 129, 79, 3143 }, // W. Central Africa Standard Time / Gabon - { 95, 182, 3161 }, // SA Western Standard Time / Saint Vincent And The Grenadines - { 48, 224, 3180 }, // GMT Standard Time / United Kingdom - { 68, 227, 3194 }, // Montevideo Standard Time / Uruguay - { 124, 0, 3213 }, // UTC+12 / AnyCountry - { 130, 230, 3224 }, // W. Europe Standard Time / Vatican City State - { 50, 99, 3239 }, // Greenwich Standard Time / Iceland - { 34, 55, 3258 }, // Cuba Standard Time / Cuba - { 41, 16, 3273 }, // Eastern Standard Time / Bahamas - { 122, 196, 3288 }, // UTC-02 / South Georgia And The South Sandwich Islands - { 24, 65, 3311 }, // Central America Standard Time / El Salvador - { 31, 225, 3331 }, // Central Standard Time / United States - { 95, 0, 3499 }, // SA Western Standard Time / AnyCountry - { 94, 166, 3509 }, // SA Pacific Standard Time / Panama - { 94, 47, 3524 }, // SA Pacific Standard Time / Colombia - { 70, 139, 3539 }, // Mountain Standard Time (Mexico) / Mexico - { 124, 220, 3574 }, // UTC+12 / Tuvalu - { 130, 84, 3591 }, // W. Europe Standard Time / Gibraltar - { 82, 178, 3608 }, // Omsk Standard Time / Russia - { 60, 122, 3618 }, // Libya Standard Time / Libya - { 25, 8, 3633 }, // Central Asia Standard Time / Antarctica - { 95, 12, 3651 }, // SA Western Standard Time / Aruba - { 67, 119, 3665 }, // Middle East Standard Time / Lebanon - { 102, 0, 3677 }, // Singapore Standard Time / AnyCountry - { 74, 148, 3687 }, // Namibia Standard Time / Namibia - { 126, 231, 3703 }, // Venezuela Standard Time / Venezuela - { 95, 234, 3719 }, // SA Western Standard Time / United States Virgin Islands - { 21, 0, 3737 }, // Cape Verde Standard Time / AnyCountry - { 95, 9, 3747 }, // SA Western Standard Time / Antigua And Barbuda - { 94, 169, 3763 }, // SA Pacific Standard Time / Peru - { 46, 248, 3776 }, // FLE Standard Time / Aland Islands - { 50, 199, 3793 }, // Greenwich Standard Time / Saint Helena - { 134, 140, 3812 }, // West Pacific Standard Time / Micronesia - { 102, 190, 3825 }, // Singapore Standard Time / Singapore - { 95, 61, 3840 }, // SA Western Standard Time / Dominican Republic - { 103, 129, 3862 }, // South Africa Standard Time / Malawi - { 30, 139, 3878 }, // Central Standard Time (Mexico) / Mexico - { 102, 130, 3954 }, // Singapore Standard Time / Malaysia - { 45, 72, 3985 }, // Fiji Standard Time / Fiji - { 118, 225, 3998 }, // US Mountain Standard Time / United States - { 17, 25, 4014 }, // Bangladesh Standard Time / Bhutan - { 130, 133, 4027 }, // W. Europe Standard Time / Malta - { 92, 178, 4040 }, // Russian Standard Time / Russia - { 95, 135, 4084 }, // SA Western Standard Time / Martinique - { 35, 0, 4103 }, // Dateline Standard Time / AnyCountry - { 135, 178, 4114 }, // Yakutsk Standard Time / Russia - { 1, 1, 4141 }, // Afghanistan Standard Time / Afghanistan - { 123, 0, 4152 }, // UTC / AnyCountry - { 31, 139, 4168 }, // Central Standard Time / Mexico - { 6, 0, 4186 }, // Arabian Standard Time / AnyCountry - { 101, 45, 4196 }, // SE Asia Standard Time / Christmas Island - { 15, 173, 4213 }, // Azores Standard Time / Portugal - { 129, 0, 4229 }, // W. Central Africa Standard Time / AnyCountry - { 17, 18, 4239 }, // Bangladesh Standard Time / Bangladesh - { 31, 38, 4250 }, // Central Standard Time / Canada - { 94, 0, 4325 }, // SA Pacific Standard Time / AnyCountry - { 125, 213, 4335 }, // UTC+13 / Tokelau - { 73, 178, 4351 }, // N. Central Asia Standard Time / Russia - { 133, 165, 4368 }, // West Bank Standard Time / Palestinian Territories - { 114, 217, 4390 }, // Turkey Standard Time / Turkey - { 3, 225, 4406 }, // Aleutian Standard Time / United States - { 101, 0, 4419 }, // SE Asia Standard Time / AnyCountry - { 71, 225, 4429 }, // Mountain Standard Time / United States - { 36, 69, 4458 }, // E. Africa Standard Time / Ethiopia - { 130, 151, 4477 }, // W. Europe Standard Time / Netherlands - { 95, 245, 4494 }, // SA Western Standard Time / Saint Martin - { 48, 173, 4510 }, // GMT Standard Time / Portugal - { 46, 124, 4541 }, // FLE Standard Time / Lithuania - { 130, 82, 4556 }, // W. Europe Standard Time / Germany - { 65, 77, 4586 }, // Marquesas Standard Time / French Polynesia - { 80, 178, 4604 }, // North Asia Standard Time / Russia - { 61, 112, 4639 }, // Line Islands Standard Time / Kiribati - { 96, 200, 4658 }, // Saint Pierre Standard Time / Saint Pierre And Miquelon - { 48, 104, 4675 }, // GMT Standard Time / Ireland - { 5, 186, 4689 }, // Arab Standard Time / Saudi Arabia - { 83, 43, 4701 }, // Pacific SA Standard Time / Chile - { 91, 178, 4718 }, // Russia Time Zone 11 / Russia - { 36, 48, 4745 }, // E. Africa Standard Time / Comoros - { 95, 152, 4759 }, // SA Western Standard Time / Cura Sao - { 38, 141, 4775 }, // E. Europe Standard Time / Moldova - { 24, 22, 4791 }, // Central America Standard Time / Belize - { 103, 195, 4806 }, // South Africa Standard Time / South Africa - { 127, 178, 4826 }, // Vladivostok Standard Time / Russia - { 122, 0, 4857 }, // UTC-02 / AnyCountry - { 106, 207, 4867 }, // Syria Standard Time / Syria - { 93, 76, 4881 }, // SA Eastern Standard Time / French Guiana - { 50, 136, 4897 }, // Greenwich Standard Time / Mauritania - { 41, 0, 4915 }, // Eastern Standard Time / AnyCountry - { 16, 30, 4923 }, // Bahia Standard Time / Brazil - { 40, 43, 4937 }, // Easter Island Standard Time / Chile - { 93, 0, 4952 }, // SA Eastern Standard Time / AnyCountry - { 9, 178, 4962 }, // Astrakhan Standard Time / Russia - { 95, 30, 4996 }, // SA Western Standard Time / Brazil - { 18, 20, 5049 }, // Belarus Standard Time / Belarus - { 95, 181, 5062 }, // SA Western Standard Time / Saint Lucia - { 129, 6, 5079 }, // W. Central Africa Standard Time / Angola - { 129, 157, 5093 }, // W. Central Africa Standard Time / Nigeria - { 130, 5, 5106 }, // W. Europe Standard Time / Andorra - { 58, 178, 5121 }, // Kaliningrad Standard Time / Russia - { 71, 0, 5140 }, // Mountain Standard Time / AnyCountry - { 95, 7, 5148 }, // SA Western Standard Time / Anguilla - { 124, 235, 5165 }, // UTC+12 / Wallis And Futuna Islands - { 6, 223, 5180 }, // Arabian Standard Time / United Arab Emirates - { 94, 40, 5191 }, // SA Pacific Standard Time / Cayman Islands - { 101, 211, 5206 }, // SE Asia Standard Time / Thailand - { 29, 193, 5219 }, // Central Pacific Standard Time / Solomon Islands - { 47, 81, 5239 }, // Georgian Standard Time / Georgia - { 101, 36, 5252 }, // SE Asia Standard Time / Cambodia - { 132, 228, 5268 }, // West Asia Standard Time / Uzbekistan - { 51, 56, 5297 }, // GTB Standard Time / Cyprus - { 95, 88, 5325 }, // SA Western Standard Time / Guadeloupe - { 101, 232, 5344 }, // SE Asia Standard Time / Vietnam - { 113, 178, 5356 }, // Transbaikal Standard Time / Russia - { 50, 121, 5367 }, // Greenwich Standard Time / Liberia - { 95, 233, 5383 }, // SA Western Standard Time / British Virgin Islands - { 129, 49, 5399 }, // W. Central Africa Standard Time / Congo Kinshasa - { 97, 178, 5415 }, // Sakhalin Standard Time / Russia - { 124, 226, 5429 }, // UTC+12 / United States Minor Outlying Islands - { 50, 83, 5442 }, // Greenwich Standard Time / Ghana - { 76, 154, 5455 }, // New Zealand Standard Time / New Zealand - { 23, 13, 5472 }, // Cen. Australia Standard Time / Australia - { 53, 77, 5513 }, // Hawaiian Standard Time / French Polynesia - { 50, 34, 5528 }, // Greenwich Standard Time / Burkina Faso - { 132, 78, 5547 }, // West Asia Standard Time / French Southern Territories - { 121, 0, 5564 }, // UTC-08 / AnyCountry - { 27, 2, 5574 }, // Central Europe Standard Time / Albania - { 107, 208, 5588 }, // Taipei Standard Time / Taiwan - { 88, 58, 5600 }, // Romance Standard Time / Denmark - { 36, 221, 5618 }, // E. Africa Standard Time / Uganda - { 95, 19, 5633 }, // SA Western Standard Time / Barbados - { 14, 15, 5650 }, // Azerbaijan Standard Time / Azerbaijan - { 32, 97, 5660 }, // China Standard Time / Hong Kong - { 110, 101, 5675 }, // Tokyo Standard Time / Indonesia - { 53, 225, 5689 }, // Hawaiian Standard Time / United States - { 36, 111, 5706 }, // E. Africa Standard Time / Kenya - { 134, 89, 5721 }, // West Pacific Standard Time / Guam - { 36, 254, 5734 }, // E. Africa Standard Time / South Sudan - { 48, 71, 5746 }, // GMT Standard Time / Faroe Islands - { 90, 178, 5762 }, // Russia Time Zone 10 / Russia - { 119, 158, 5781 }, // UTC-11 / Niue - { 129, 3, 5794 }, // W. Central Africa Standard Time / Algeria - { 110, 62, 5809 }, // Tokyo Standard Time / East Timor - { 93, 30, 5819 }, // SA Eastern Standard Time / Brazil - { 27, 242, 5898 }, // Central Europe Standard Time / Montenegro - { 129, 37, 5915 }, // W. Central Africa Standard Time / Cameroon - { 101, 117, 5929 }, // SE Asia Standard Time / Laos - { 85, 139, 5944 }, // Pacific Standard Time (Mexico) / Mexico - { 50, 212, 5981 }, // Greenwich Standard Time / Togo - { 46, 118, 5993 }, // FLE Standard Time / Latvia - { 95, 38, 6005 }, // SA Western Standard Time / Canada - { 132, 209, 6026 }, // West Asia Standard Time / Tajikistan - { 77, 38, 6040 }, // Newfoundland Standard Time / Canada - { 110, 108, 6057 }, // Tokyo Standard Time / Japan - { 25, 0, 6068 }, // Central Asia Standard Time / AnyCountry - { 28, 27, 6078 }, // Central European Standard Time / Bosnia And Herzegowina - { 27, 191, 6094 }, // Central Europe Standard Time / Slovakia - { 95, 93, 6112 }, // SA Western Standard Time / Guyana - { 48, 197, 6127 }, // GMT Standard Time / Spain - { 19, 167, 6143 }, // Bougainville Standard Time / Papua New Guinea - { 5, 17, 6164 }, // Arab Standard Time / Bahrain - { 24, 90, 6177 }, // Central America Standard Time / Guatemala - { 95, 26, 6195 }, // SA Western Standard Time / Bolivia - { 81, 113, 6210 }, // North Korea Standard Time / North Korea - { 119, 4, 6225 }, // UTC-11 / American Samoa - { 66, 176, 6243 }, // Mauritius Standard Time / Reunion - { 103, 120, 6258 }, // South Africa Standard Time / Lesotho - { 84, 0, 6272 }, // Pacific Standard Time / AnyCountry - { 120, 0, 6280 }, // UTC-09 / AnyCountry - { 129, 216, 6290 }, // W. Central Africa Standard Time / Tunisia - { 99, 185, 6303 }, // Sao Tome Standard Time / Sao Tome And Principe - { 100, 178, 6319 }, // Saratov Standard Time / Russia - { 105, 201, 6334 }, // Sudan Standard Time / Sudan - { 48, 252, 6350 }, // GMT Standard Time / Jersey - { 29, 13, 6364 }, // Central Pacific Standard Time / Australia - { 71, 139, 6385 }, // Mountain Standard Time / Mexico - { 21, 39, 6401 }, // Cape Verde Standard Time / Cape Verde - { 102, 101, 6421 }, // Singapore Standard Time / Indonesia - { 27, 192, 6435 }, // Central Europe Standard Time / Slovenia - { 48, 75, 6452 }, // GMT Standard Time / Guernsey - { 132, 8, 6468 }, // West Asia Standard Time / Antarctica - { 8, 10, 6486 }, // Argentina Standard Time / Argentina - { 98, 183, 6759 }, // Samoa Standard Time / Samoa - { 129, 41, 6772 }, // W. Central Africa Standard Time / Central African Republic - { 111, 178, 6786 }, // Tomsk Standard Time / Russia - { 110, 164, 6797 }, // Tokyo Standard Time / Palau - { 11, 13, 6811 }, // AUS Central Standard Time / Australia - { 121, 171, 6828 }, // UTC-08 / Pitcairn - { 102, 32, 6845 }, // Singapore Standard Time / Brunei - { 112, 214, 6857 }, // Tonga Standard Time / Tonga - { 89, 178, 6875 }, // Russia Time Zone 3 / Russia - { 128, 13, 6889 }, // W. Australia Standard Time / Australia - { 28, 172, 6905 }, // Central European Standard Time / Poland - { 72, 46, 6919 }, // Myanmar Standard Time / Cocos Islands - { 66, 188, 6932 }, // Mauritius Standard Time / Seychelles - { 84, 225, 6944 }, // Pacific Standard Time / United States - { 54, 100, 6983 }, // India Standard Time / India - { 50, 53, 6997 }, // Greenwich Standard Time / Ivory Coast - { 24, 0, 7012 }, // Central America Standard Time / AnyCountry - { 29, 229, 7022 }, // Central Pacific Standard Time / Vanuatu - { 130, 125, 7036 }, // W. Europe Standard Time / Luxembourg - { 50, 132, 7054 }, // Greenwich Standard Time / Mali - { 103, 179, 7068 }, // South Africa Standard Time / Rwanda - { 5, 175, 7082 }, // Arab Standard Time / Qatar - { 86, 163, 7093 }, // Pakistan Standard Time / Pakistan - { 134, 0, 7106 }, // West Pacific Standard Time / AnyCountry - { 36, 59, 7117 }, // E. Africa Standard Time / Djibouti - { 44, 178, 7133 }, // Ekaterinburg Standard Time / Russia - { 118, 38, 7152 }, // US Mountain Standard Time / Canada - { 36, 138, 7209 }, // E. Africa Standard Time / Mayotte - { 28, 127, 7224 }, // Central European Standard Time / Macedonia - { 59, 114, 7238 }, // Korea Standard Time / South Korea - { 93, 202, 7249 }, // SA Eastern Standard Time / Suriname - { 130, 205, 7268 }, // W. Europe Standard Time / Sweden - { 103, 49, 7285 }, // South Africa Standard Time / Congo Kinshasa - { 0, 0, 0 } // Trailing zeroes -}; - -// Windows ID Key, Windows ID Index, IANA ID Index, UTC Offset -static const QWindowsData windowsDataTable[] = { - { 1, 0, 4141, 16200 }, // Afghanistan Standard Time - { 2, 26, 7303,-32400 }, // Alaskan Standard Time - { 3, 48, 4406,-36000 }, // Aleutian Standard Time - { 4, 71, 325, 25200 }, // Altai Standard Time - { 5, 91, 4689, 10800 }, // Arab Standard Time - { 6, 110, 5180, 14400 }, // Arabian Standard Time - { 7, 132, 953, 10800 }, // Arabic Standard Time - { 8, 153, 7321,-10800 }, // Argentina Standard Time - { 9, 177, 7342, 14400 }, // Astrakhan Standard Time - { 10, 201, 7359,-14400 }, // Atlantic Standard Time - { 11, 224, 6811, 34200 }, // AUS Central Standard Time - { 12, 250, 2225, 31500 }, // Aus Central W. Standard Time - { 13, 279, 7375, 36000 }, // AUS Eastern Standard Time - { 14, 305, 5650, 14400 }, // Azerbaijan Standard Time - { 15, 330, 4213, -3600 }, // Azores Standard Time - { 16, 351, 4923,-10800 }, // Bahia Standard Time - { 17, 371, 4239, 21600 }, // Bangladesh Standard Time - { 18, 396, 5049, 10800 }, // Belarus Standard Time - { 19, 418, 6143, 39600 }, // Bougainville Standard Time - { 20, 445, 7392,-21600 }, // Canada Central Standard Time - { 21, 474, 6401, -3600 }, // Cape Verde Standard Time - { 22, 499, 1138, 14400 }, // Caucasus Standard Time - { 23, 522, 7407, 34200 }, // Cen. Australia Standard Time - { 24, 551, 6177,-21600 }, // Central America Standard Time - { 25, 581, 7426, 21600 }, // Central Asia Standard Time - { 26, 608, 7438,-14400 }, // Central Brazilian Standard Time - { 27, 640, 3077, 3600 }, // Central Europe Standard Time - { 28, 669, 6905, 3600 }, // Central European Standard Time - { 29, 700, 5219, 39600 }, // Central Pacific Standard Time - { 30, 730, 7453,-21600 }, // Central Standard Time (Mexico) - { 31, 761, 7473,-21600 }, // Central Standard Time - { 32, 783, 48, 28800 }, // China Standard Time - { 33, 803, 114, 45900 }, // Chatham Islands Standard Time - { 34, 833, 3258,-18000 }, // Cuba Standard Time - { 35, 852, 4103,-43200 }, // Dateline Standard Time - { 36, 875, 5706, 10800 }, // E. Africa Standard Time - { 37, 899, 7489, 36000 }, // E. Australia Standard Time - { 38, 926, 4775, 7200 }, // E. Europe Standard Time - { 39, 950, 451,-10800 }, // E. South America Standard Time - { 40, 981, 4937,-21600 }, // Easter Island Standard Time - { 41, 1009, 7508,-18000 }, // Eastern Standard Time - { 42, 1031, 2938,-18000 }, // Eastern Standard Time (Mexico) - { 43, 1062, 2284, 7200 }, // Egypt Standard Time - { 44, 1082, 7133, 18000 }, // Ekaterinburg Standard Time - { 45, 1109, 3985, 43200 }, // Fiji Standard Time - { 46, 1128, 7525, 7200 }, // FLE Standard Time - { 47, 1146, 5239, 14400 }, // Georgian Standard Time - { 48, 1169, 3180, 0 }, // GMT Standard Time - { 49, 1187, 3029,-10800 }, // Greenland Standard Time - { 50, 1211, 3239, 0 }, // Greenwich Standard Time - { 51, 1235, 2332, 7200 }, // GTB Standard Time - { 52, 1253, 25,-18000 }, // Haiti Standard Time - { 53, 1273, 5689,-36000 }, // Hawaiian Standard Time - { 54, 1296, 6983, 19800 }, // India Standard Time - { 55, 1316, 1271, 12600 }, // Iran Standard Time - { 56, 1335, 2192, 7200 }, // Israel Standard Time - { 57, 1356, 1242, 7200 }, // Jordan Standard Time - { 58, 1377, 5121, 7200 }, // Kaliningrad Standard Time - { 59, 1403, 7238, 32400 }, // Korea Standard Time - { 60, 1423, 3618, 7200 }, // Libya Standard Time - { 61, 1443, 4639, 50400 }, // Line Islands Standard Time - { 62, 1470, 3113, 37800 }, // Lord Howe Standard Time - { 63, 1494, 2758, 36000 }, // Magadan Standard Time - { 64, 1516, 1054,-10800 }, // Magallanes Standard Time - { 65, 1541, 4586,-34200 }, // Marquesas Standard Time - { 66, 1565, 1863, 14400 }, // Mauritius Standard Time - { 67, 1589, 3665, 7200 }, // Middle East Standard Time - { 68, 1615, 3194,-10800 }, // Montevideo Standard Time - { 69, 1640, 2125, 0 }, // Morocco Standard Time - { 70, 1662, 7537,-25200 }, // Mountain Standard Time (Mexico) - { 71, 1694, 7555,-25200 }, // Mountain Standard Time - { 72, 1717, 657, 23400 }, // Myanmar Standard Time - { 73, 1739, 4351, 21600 }, // N. Central Asia Standard Time - { 74, 1769, 3687, 3600 }, // Namibia Standard Time - { 75, 1791, 793, 20700 }, // Nepal Standard Time - { 76, 1811, 5455, 43200 }, // New Zealand Standard Time - { 77, 1837, 6040,-12600 }, // Newfoundland Standard Time - { 78, 1864, 752, 39600 }, // Norfolk Standard Time - { 79, 1886, 2534, 28800 }, // North Asia East Standard Time - { 80, 1916, 7570, 25200 }, // North Asia Standard Time - { 81, 1941, 6210, 30600 }, // North Korea Standard Time - { 82, 1967, 3608, 21600 }, // Omsk Standard Time - { 83, 1986, 4701,-10800 }, // Pacific SA Standard Time - { 84, 2011, 7587,-28800 }, // Pacific Standard Time - { 85, 2033, 7607,-28800 }, // Pacific Standard Time (Mexico) - { 86, 2064, 7093, 18000 }, // Pakistan Standard Time - { 87, 2087, 1225,-14400 }, // Paraguay Standard Time - { 88, 2110, 570, 3600 }, // Romance Standard Time - { 89, 2132, 6875, 14400 }, // Russia Time Zone 3 - { 90, 2151, 5762, 39600 }, // Russia Time Zone 10 - { 91, 2171, 7623, 43200 }, // Russia Time Zone 11 - { 92, 2191, 7638, 10800 }, // Russian Standard Time - { 93, 2213, 4881,-10800 }, // SA Eastern Standard Time - { 94, 2238, 3524,-18000 }, // SA Pacific Standard Time - { 95, 2263, 6195,-14400 }, // SA Western Standard Time - { 96, 2288, 4658,-10800 }, // Saint Pierre Standard Time - { 97, 2315, 5415, 39600 }, // Sakhalin Standard Time - { 98, 2338, 6759, 46800 }, // Samoa Standard Time - { 99, 2358, 6303, 0 }, // Sao Tome Standard Time - { 100, 2381, 6319, 14400 }, // Saratov Standard Time - { 101, 2403, 5206, 25200 }, // SE Asia Standard Time - { 102, 2425, 3825, 28800 }, // Singapore Standard Time - { 103, 2449, 4806, 7200 }, // South Africa Standard Time - { 104, 2476, 1447, 19800 }, // Sri Lanka Standard Time - { 105, 2500, 6334, 7200 }, // Sudan Standard Time - { 106, 2520, 4867, 7200 }, // Syria Standard Time - { 107, 2540, 5588, 28800 }, // Taipei Standard Time - { 108, 2561, 7652, 36000 }, // Tasmania Standard Time - { 109, 2584, 1253,-10800 }, // Tocantins Standard Time - { 110, 2608, 6057, 32400 }, // Tokyo Standard Time - { 111, 2628, 6786, 25200 }, // Tomsk Standard Time - { 112, 2648, 6857, 46800 }, // Tonga Standard Time - { 113, 2668, 5356, 32400 }, // Transbaikal Standard Time - { 114, 2694, 4390, 7200 }, // Turkey Standard Time - { 115, 2715, 2143,-14400 }, // Turks And Caicos Standard Time - { 116, 2746, 7669, 28800 }, // Ulaanbaatar Standard Time - { 117, 2772, 7686,-18000 }, // US Eastern Standard Time - { 118, 2797, 3998,-25200 }, // US Mountain Standard Time - { 119, 2823, 1075,-39600 }, // UTC-11 - { 120, 2830, 6280,-32400 }, // UTC-09 - { 121, 2837, 5564,-28800 }, // UTC-08 - { 122, 2844, 4857, -7200 }, // UTC-02 - { 123, 2851, 7707, 0 }, // UTC - { 124, 2855, 3213, 43200 }, // UTC+12 - { 125, 2862, 1502, 46800 }, // UTC+13 - { 126, 2869, 3703,-16200 }, // Venezuela Standard Time - { 127, 2893, 7715, 36000 }, // Vladivostok Standard Time - { 128, 2919, 6889, 28800 }, // W. Australia Standard Time - { 129, 2946, 5093, 3600 }, // W. Central Africa Standard Time - { 130, 2978, 7732, 3600 }, // W. Europe Standard Time - { 131, 3002, 0, 25200 }, // W. Mongolia Standard Time - { 132, 3028, 7746, 18000 }, // West Asia Standard Time - { 133, 3052, 7760, 7200 }, // West Bank Standard Time - { 134, 3076, 377, 36000 }, // West Pacific Standard Time - { 135, 3103, 7772, 32400 }, // Yakutsk Standard Time - { 0, 0, 0, 0 } // Trailing zeroes -}; - -// IANA ID Index, UTC Offset -static const QUtcData utcDataTable[] = { - { 7785, 0 }, // UTC - { 7789,-50400 }, // UTC-14:00 - { 7799,-46800 }, // UTC-13:00 - { 7809,-43200 }, // UTC-12:00 - { 7819,-39600 }, // UTC-11:00 - { 7829,-36000 }, // UTC-10:00 - { 7839,-32400 }, // UTC-09:00 - { 7849,-28800 }, // UTC-08:00 - { 7859,-25200 }, // UTC-07:00 - { 7869,-21600 }, // UTC-06:00 - { 7879,-18000 }, // UTC-05:00 - { 7889,-16200 }, // UTC-04:30 - { 7899,-14400 }, // UTC-04:00 - { 7909,-12600 }, // UTC-03:30 - { 7919,-10800 }, // UTC-03:00 - { 7929, -7200 }, // UTC-02:00 - { 7939, -3600 }, // UTC-01:00 - { 7949, 0 }, // UTC-00:00 - { 7959, 0 }, // UTC+00:00 - { 7969, 3600 }, // UTC+01:00 - { 7979, 7200 }, // UTC+02:00 - { 7989, 10800 }, // UTC+03:00 - { 7999, 12600 }, // UTC+03:30 - { 8009, 14400 }, // UTC+04:00 - { 8019, 16200 }, // UTC+04:30 - { 8029, 18000 }, // UTC+05:00 - { 8039, 19800 }, // UTC+05:30 - { 8049, 20700 }, // UTC+05:45 - { 8059, 21600 }, // UTC+06:00 - { 8069, 23400 }, // UTC+06:30 - { 8079, 25200 }, // UTC+07:00 - { 8089, 28800 }, // UTC+08:00 - { 8099, 30600 }, // UTC+08:30 - { 8109, 32400 }, // UTC+09:00 - { 8119, 34200 }, // UTC+09:30 - { 8129, 36000 }, // UTC+10:00 - { 8139, 39600 }, // UTC+11:00 - { 8149, 43200 }, // UTC+12:00 - { 8159, 46800 }, // UTC+13:00 - { 8169, 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, 0x6c, 0x65, 0x75, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, -0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x6c, 0x74, 0x61, 0x69, 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, 0x73, 0x74, -0x72, 0x61, 0x6b, 0x68, 0x61, 0x6e, 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, 0x75, 0x73, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, -0x6c, 0x20, 0x57, 0x2e, 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, 0x42, 0x65, 0x6c, 0x61, -0x72, 0x75, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x42, 0x6f, -0x75, 0x67, 0x61, 0x69, 0x6e, 0x76, 0x69, 0x6c, 0x6c, 0x65, 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, 0x43, 0x68, 0x61, 0x74, 0x68, 0x61, 0x6d, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x53, -0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x75, 0x62, 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, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 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, 0x61, 0x73, 0x74, 0x65, 0x72, 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, 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, 0x69, 0x74, 0x69, 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, 0x4c, 0x69, 0x62, 0x79, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, -0x6d, 0x65, 0x0, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, -0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4c, 0x6f, 0x72, 0x64, 0x20, 0x48, 0x6f, 0x77, 0x65, 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, 0x67, 0x61, -0x6c, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, -0x0, 0x4d, 0x61, 0x72, 0x71, 0x75, 0x65, 0x73, 0x61, 0x73, 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, 0x66, 0x6f, 0x6c, 0x6b, 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, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x4b, 0x6f, 0x72, 0x65, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, -0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4f, 0x6d, 0x73, 0x6b, 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, 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, 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, 0x20, 0x54, -0x69, 0x6d, 0x65, 0x20, 0x5a, 0x6f, 0x6e, 0x65, 0x20, 0x33, 0x0, 0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x20, 0x54, 0x69, -0x6d, 0x65, 0x20, 0x5a, 0x6f, 0x6e, 0x65, 0x20, 0x31, 0x30, 0x0, 0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x20, 0x54, 0x69, -0x6d, 0x65, 0x20, 0x5a, 0x6f, 0x6e, 0x65, 0x20, 0x31, 0x31, 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, 0x69, 0x6e, 0x74, 0x20, 0x50, 0x69, 0x65, 0x72, 0x72, 0x65, -0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x61, 0x6b, 0x68, 0x61, -0x6c, 0x69, 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, 0x61, -0x6f, 0x20, 0x54, 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, -0x0, 0x53, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x76, 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, 0x75, 0x64, 0x61, 0x6e, 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, 0x63, 0x61, 0x6e, 0x74, 0x69, 0x6e, 0x73, 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, 0x6d, 0x73, 0x6b, 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, 0x72, 0x61, 0x6e, 0x73, 0x62, 0x61, 0x69, 0x6b, 0x61, 0x6c, 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, 0x54, 0x75, 0x72, 0x6b, 0x73, -0x20, 0x41, 0x6e, 0x64, 0x20, 0x43, 0x61, 0x69, 0x63, 0x6f, 0x73, 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, 0x31, 0x31, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x39, 0x0, 0x55, 0x54, 0x43, -0x2d, 0x30, 0x38, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x32, 0x0, 0x55, 0x54, 0x43, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, -0x32, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x33, 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, 0x2e, 0x20, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x61, 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, 0x42, 0x61, 0x6e, -0x6b, 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 ianaIdData[] = { -0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x76, 0x64, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x61, -0x72, 0x61, 0x77, 0x61, 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, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x68, 0x61, 0x6e, 0x67, 0x68, 0x61, -0x69, 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, 0x42, 0x69, 0x73, 0x68, 0x6b, 0x65, 0x6b, 0x0, 0x41, 0x6e, 0x74, -0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x79, 0x6f, 0x77, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, -0x63, 0x2f, 0x43, 0x68, 0x61, 0x74, 0x68, 0x61, 0x6d, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, -0x6e, 0x74, 0x73, 0x65, 0x72, 0x72, 0x61, 0x74, 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, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x34, 0x0, 0x41, 0x73, -0x69, 0x61, 0x2f, 0x41, 0x73, 0x68, 0x67, 0x61, 0x62, 0x61, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, -0x4e, 0x6f, 0x72, 0x6f, 0x6e, 0x68, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x73, 0x74, -0x61, 0x5f, 0x52, 0x69, 0x63, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x73, 0x6d, 0x65, 0x72, 0x61, -0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x73, 0x65, 0x79, 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, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x6f, 0x74, -0x68, 0x65, 0x72, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x72, 0x6e, 0x61, 0x75, 0x6c, 0x0, 0x41, 0x6d, -0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x0, -0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x0, 0x50, 0x61, 0x63, -0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f, 0x4d, 0x6f, 0x72, 0x65, 0x73, 0x62, 0x79, 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, 0x41, 0x66, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x45, 0x6c, 0x5f, 0x41, 0x61, 0x69, 0x75, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, -0x61, 0x6f, 0x5f, 0x50, 0x61, 0x75, 0x6c, 0x6f, 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, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x6e, 0x64, 0x65, 0x72, 0x62, 0x75, 0x72, 0x79, 0x0, -0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x70, 0x75, 0x74, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x52, 0x69, 0x6f, 0x5f, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x45, 0x69, 0x72, 0x75, 0x6e, 0x65, 0x70, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x61, 0x72, -0x69, 0x73, 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, 0x73, 0x69, -0x61, 0x2f, 0x52, 0x61, 0x6e, 0x67, 0x6f, 0x6f, 0x6e, 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, 0x56, 0x61, 0x64, 0x75, 0x7a, 0x0, 0x45, -0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x48, 0x65, 0x6c, 0x73, 0x69, 0x6e, 0x6b, 0x69, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, -0x74, 0x69, 0x63, 0x2f, 0x53, 0x74, 0x61, 0x6e, 0x6c, 0x65, 0x79, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, -0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c, 0x6b, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x30, 0x0, 0x45, -0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x61, 0x67, 0x72, 0x65, 0x62, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, -0x74, 0x6d, 0x61, 0x6e, 0x64, 0x75, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6f, 0x66, 0x69, 0x61, 0x0, -0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x75, 0x73, 0x63, 0x61, 0x74, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, -0x61, 0x6c, 0x64, 0x69, 0x76, 0x65, 0x73, 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, 0x66, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x43, 0x6f, 0x6e, 0x61, 0x6b, 0x72, 0x79, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x64, 0x65, 0x6e, 0x0, -0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x69, 0x6d, 0x66, 0x65, 0x72, 0x6f, 0x70, 0x6f, 0x6c, 0x0, 0x41, 0x66, -0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x62, 0x61, 0x62, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x72, 0x63, 0x74, 0x69, 0x63, 0x2f, -0x4c, 0x6f, 0x6e, 0x67, 0x79, 0x65, 0x61, 0x72, 0x62, 0x79, 0x65, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, -0x67, 0x68, 0x64, 0x61, 0x64, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x69, 0x64, 0x77, 0x61, 0x79, -0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x77, 0x61, 0x69, 0x74, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, -0x46, 0x72, 0x65, 0x65, 0x74, 0x6f, 0x77, 0x6e, 0x0, 0x43, 0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x0, 0x50, 0x61, 0x63, -0x69, 0x66, 0x69, 0x63, 0x2f, 0x52, 0x61, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x42, 0x72, 0x61, 0x7a, 0x7a, 0x61, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x50, 0x75, 0x6e, 0x74, 0x61, 0x5f, 0x41, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, -0x4d, 0x54, 0x2b, 0x31, 0x31, 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, 0x41, 0x73, -0x69, 0x61, 0x2f, 0x59, 0x65, 0x72, 0x65, 0x76, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, -0x6e, 0x61, 0x63, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x73, 0x61, 0x6b, 0x61, 0x0, 0x45, -0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x69, 0x65, 0x76, 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, 0x41, 0x73, 0x75, 0x6e, 0x63, 0x69, 0x6f, -0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6d, 0x6d, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x41, 0x72, 0x61, 0x67, 0x75, 0x61, 0x69, 0x6e, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x65, 0x68, 0x72, -0x61, 0x6e, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x76, 0x69, 0x73, 0x0, -0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x72, 0x61, 0x67, 0x75, 0x65, 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, 0x47, 0x61, 0x62, 0x6f, 0x72, 0x6f, 0x6e, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, -0x35, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x79, 0x61, 0x71, 0x75, 0x69, 0x6c, 0x0, -0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x74, 0x68, 0x65, 0x6e, 0x73, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, -0x2f, 0x41, 0x6e, 0x74, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x76, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, -0x63, 0x2f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x74, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, -0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x6f, 0x0, -0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x6c, 0x67, 0x72, 0x61, 0x64, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, -0x2f, 0x41, 0x6c, 0x6d, 0x61, 0x74, 0x79, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51, 0x6f, 0x73, 0x74, 0x61, 0x6e, 0x61, -0x79, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x33, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x43, 0x6f, 0x72, 0x61, 0x6c, 0x5f, 0x48, 0x61, 0x72, 0x62, 0x6f, 0x75, 0x72, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, -0x6e, 0x2f, 0x43, 0x68, 0x61, 0x67, 0x6f, 0x73, 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, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x75, 0x65, 0x72, 0x74, 0x6f, 0x5f, 0x52, 0x69, -0x63, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4b, 0x69, 0x74, 0x74, 0x73, 0x0, -0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x75, 0x72, 0x69, 0x63, 0x68, 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, 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, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, -0x61, 0x6d, 0x62, 0x69, 0x65, 0x72, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x69, 0x61, 0x6d, 0x65, 0x79, -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, 0x4d, 0x6f, 0x67, 0x61, 0x64, 0x69, 0x73, 0x68, 0x75, 0x0, 0x45, 0x74, 0x63, -0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x37, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x42, 0x65, 0x72, 0x6d, -0x75, 0x64, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x72, 0x61, 0x72, 0x65, 0x0, 0x41, 0x73, -0x69, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x61, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6c, 0x61, -0x62, 0x6f, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75, 0x73, 0x0, -0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x54, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x44, 0x61, 0x6b, 0x61, 0x72, 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, -0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x74, 0x79, 0x72, 0x61, 0x75, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51, 0x79, -0x7a, 0x79, 0x6c, 0x6f, 0x72, 0x64, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x72, 0x75, 0x6d, 0x71, 0x69, 0x0, -0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x6f, 0x6d, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, -0x73, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x5f, 0x4d, 0x61, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, -0x72, 0x5f, 0x65, 0x73, 0x5f, 0x53, 0x61, 0x6c, 0x61, 0x61, 0x6d, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, -0x54, 0x68, 0x75, 0x6c, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x6e, 0x6d, 0x61, 0x72, -0x6b, 0x73, 0x68, 0x61, 0x76, 0x6e, 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, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x62, 0x79, -0x73, 0x75, 0x6e, 0x64, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x73, 0x61, 0x62, 0x6c, 0x61, 0x6e, -0x63, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x61, 0x6e, 0x64, 0x5f, 0x54, 0x75, 0x72, -0x6b, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x6e, 0x6a, 0x75, 0x6c, 0x0, 0x41, 0x66, 0x72, 0x69, -0x63, 0x61, 0x2f, 0x4e, 0x64, 0x6a, 0x61, 0x6d, 0x65, 0x6e, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x65, 0x72, -0x75, 0x73, 0x61, 0x6c, 0x65, 0x6d, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, -0x6c, 0x6d, 0x65, 0x72, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x45, 0x75, 0x63, 0x6c, 0x61, -0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x75, 0x61, 0x0, 0x41, 0x73, 0x69, -0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x69, 0x6c, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x53, 0x61, 0x69, -0x70, 0x61, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x0, 0x45, 0x75, 0x72, -0x6f, 0x70, 0x65, 0x2f, 0x42, 0x72, 0x75, 0x73, 0x73, 0x65, 0x6c, 0x73, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, -0x69, 0x63, 0x61, 0x2f, 0x4d, 0x63, 0x4d, 0x75, 0x72, 0x64, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, -0x75, 0x63, 0x68, 0x61, 0x72, 0x65, 0x73, 0x74, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x32, 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, 0x66, 0x72, 0x69, -0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x2d, 0x4e, 0x6f, 0x76, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x49, -0x72, 0x6b, 0x75, 0x74, 0x73, 0x6b, 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, -0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x65, 0x6e, 0x6e, 0x61, 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, -0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6a, 0x6b, 0x0, 0x50, 0x61, -0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x61, 0x75, 0x72, 0x75, 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, 0x41, 0x73, -0x69, 0x61, 0x2f, 0x4d, 0x61, 0x67, 0x61, 0x64, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4f, 0x73, -0x6c, 0x6f, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x39, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, -0x2f, 0x47, 0x61, 0x6c, 0x61, 0x70, 0x61, 0x67, 0x6f, 0x73, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, -0x6a, 0x75, 0x6d, 0x62, 0x75, 0x72, 0x61, 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, 0x45, 0x74, 0x63, 0x2f, -0x47, 0x4d, 0x54, 0x2d, 0x31, 0x31, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x65, 0x6e, 0x61, -0x64, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x6f, 0x75, 0x6d, 0x65, 0x61, 0x0, 0x41, 0x6d, -0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x6e, 0x63, 0x75, 0x6e, 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, 0x47, 0x6f, 0x64, -0x74, 0x68, 0x61, 0x62, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x69, 0x73, 0x73, 0x61, 0x75, 0x0, 0x45, -0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x6e, 0x5f, 0x4d, 0x61, 0x72, 0x69, 0x6e, 0x6f, 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, 0x54, 0x65, 0x67, 0x75, 0x63, 0x69, 0x67, 0x61, 0x6c, 0x70, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, -0x69, 0x61, 0x2f, 0x4c, 0x6f, 0x72, 0x64, 0x5f, 0x48, 0x6f, 0x77, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, -0x2d, 0x33, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, 0x62, 0x72, 0x65, 0x76, 0x69, 0x6c, 0x6c, 0x65, -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, 0x4c, 0x6f, 0x6e, 0x64, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, -0x2d, 0x31, 0x32, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x0, 0x41, -0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x52, 0x65, 0x79, 0x6b, 0x6a, 0x61, 0x76, 0x69, 0x6b, 0x0, 0x41, 0x6d, -0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x76, 0x61, 0x6e, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x4e, 0x61, 0x73, 0x73, 0x61, 0x75, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x6f, 0x75, -0x74, 0x68, 0x5f, 0x47, 0x65, 0x6f, 0x72, 0x67, 0x69, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, -0x6c, 0x5f, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x64, 0x6f, 0x72, 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, 0x45, -0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x34, 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, -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, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, -0x63, 0x2f, 0x46, 0x75, 0x6e, 0x61, 0x66, 0x75, 0x74, 0x69, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, 0x69, -0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4f, 0x6d, 0x73, 0x6b, 0x0, 0x41, 0x66, -0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x72, 0x69, 0x70, 0x6f, 0x6c, 0x69, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, -0x69, 0x63, 0x61, 0x2f, 0x56, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, -0x72, 0x75, 0x62, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x65, 0x69, 0x72, 0x75, 0x74, 0x0, 0x45, 0x74, 0x63, -0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x38, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x64, 0x68, 0x6f, -0x65, 0x6b, 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, 0x53, 0x74, 0x5f, 0x54, 0x68, 0x6f, 0x6d, 0x61, 0x73, 0x0, 0x45, 0x74, 0x63, -0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x74, 0x69, 0x67, -0x75, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, 0x6d, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, -0x70, 0x65, 0x2f, 0x4d, 0x61, 0x72, 0x69, 0x65, 0x68, 0x61, 0x6d, 0x6e, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, -0x63, 0x2f, 0x53, 0x74, 0x5f, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, -0x54, 0x72, 0x75, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x0, -0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x6f, 0x5f, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, -0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6c, 0x61, 0x6e, 0x74, 0x79, 0x72, 0x65, 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, 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, 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, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46, 0x69, 0x6a, 0x69, 0x0, 0x41, 0x6d, -0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x68, 0x6f, 0x65, 0x6e, 0x69, 0x78, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, -0x68, 0x69, 0x6d, 0x70, 0x68, 0x75, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x6c, 0x74, 0x61, 0x0, -0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x73, 0x63, 0x6f, 0x77, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, -0x2f, 0x4b, 0x69, 0x72, 0x6f, 0x76, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x6f, 0x6c, 0x67, 0x6f, 0x67, -0x72, 0x61, 0x64, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x71, -0x75, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x32, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, -0x61, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x68, 0x61, 0x6e, 0x64, 0x79, 0x67, 0x61, -0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x62, 0x75, 0x6c, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x20, -0x45, 0x74, 0x63, 0x2f, 0x55, 0x54, 0x43, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x74, 0x61, -0x6d, 0x6f, 0x72, 0x6f, 0x73, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x34, 0x0, 0x49, 0x6e, 0x64, 0x69, -0x61, 0x6e, 0x2f, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, -0x63, 0x2f, 0x41, 0x7a, 0x6f, 0x72, 0x65, 0x73, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x0, 0x41, -0x73, 0x69, 0x61, 0x2f, 0x44, 0x68, 0x61, 0x6b, 0x61, 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, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x35, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, -0x69, 0x63, 0x2f, 0x46, 0x61, 0x6b, 0x61, 0x6f, 0x66, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, -0x73, 0x69, 0x62, 0x69, 0x72, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x65, 0x62, 0x72, 0x6f, 0x6e, 0x20, -0x41, 0x73, 0x69, 0x61, 0x2f, 0x47, 0x61, 0x7a, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, 0x73, 0x74, -0x61, 0x6e, 0x62, 0x75, 0x6c, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x64, 0x61, 0x6b, 0x0, 0x45, -0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x37, 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, 0x0, 0x41, 0x66, -0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x64, 0x64, 0x69, 0x73, 0x5f, 0x41, 0x62, 0x61, 0x62, 0x61, 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, 0x4d, 0x61, 0x72, 0x69, 0x67, 0x6f, 0x74, 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, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x6c, 0x6e, 0x69, 0x75, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, -0x70, 0x65, 0x2f, 0x42, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x73, -0x69, 0x6e, 0x67, 0x65, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x61, 0x72, 0x71, 0x75, 0x65, -0x73, 0x61, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x73, 0x6e, 0x6f, 0x79, 0x61, 0x72, 0x73, 0x6b, -0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x6b, 0x75, 0x7a, 0x6e, 0x65, 0x74, 0x73, 0x6b, 0x0, 0x50, -0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4b, 0x69, 0x72, 0x69, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x0, 0x41, 0x6d, -0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x69, 0x71, 0x75, 0x65, 0x6c, 0x6f, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, -0x65, 0x2f, 0x44, 0x75, 0x62, 0x6c, 0x69, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x52, 0x69, 0x79, 0x61, 0x64, 0x68, -0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x67, 0x6f, 0x0, 0x41, 0x73, -0x69, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x63, 0x68, 0x61, 0x74, 0x6b, 0x61, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6e, -0x61, 0x64, 0x79, 0x72, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x6f, 0x6d, 0x6f, 0x72, 0x6f, 0x0, 0x41, -0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x75, 0x72, 0x61, 0x63, 0x61, 0x6f, 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, 0x42, -0x65, 0x6c, 0x69, 0x7a, 0x65, 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, 0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, -0x6f, 0x6b, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x73, 0x74, 0x2d, 0x4e, 0x65, 0x72, 0x61, 0x0, 0x45, 0x74, 0x63, -0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x32, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x61, 0x6d, 0x61, 0x73, 0x63, 0x75, 0x73, -0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x79, 0x65, 0x6e, 0x6e, 0x65, 0x0, 0x41, 0x66, 0x72, -0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x75, 0x61, 0x6b, 0x63, 0x68, 0x6f, 0x74, 0x74, 0x0, 0x45, 0x53, 0x54, 0x35, 0x45, -0x44, 0x54, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x68, 0x69, 0x61, 0x0, 0x50, 0x61, 0x63, -0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, -0x33, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x73, 0x74, 0x72, 0x61, 0x6b, 0x68, 0x61, 0x6e, 0x20, 0x45, -0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x55, 0x6c, 0x79, 0x61, 0x6e, 0x6f, 0x76, 0x73, 0x6b, 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, 0x50, 0x6f, 0x72, -0x74, 0x6f, 0x5f, 0x56, 0x65, 0x6c, 0x68, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x69, 0x6e, 0x73, -0x6b, 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, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, -0x4c, 0x61, 0x67, 0x6f, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x6e, 0x64, 0x6f, 0x72, 0x72, 0x61, -0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x61, 0x6c, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x72, 0x61, 0x64, 0x0, -0x4d, 0x53, 0x54, 0x37, 0x4d, 0x44, 0x54, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x67, 0x75, -0x69, 0x6c, 0x6c, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x57, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x0, -0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x75, 0x62, 0x61, 0x69, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, -0x61, 0x79, 0x6d, 0x61, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x6b, 0x0, 0x50, -0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x64, 0x61, 0x6c, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x0, 0x41, -0x73, 0x69, 0x61, 0x2f, 0x54, 0x62, 0x69, 0x6c, 0x69, 0x73, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x68, 0x6e, -0x6f, 0x6d, 0x5f, 0x50, 0x65, 0x6e, 0x68, 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, 0x41, 0x73, 0x69, -0x61, 0x2f, 0x46, 0x61, 0x6d, 0x61, 0x67, 0x75, 0x73, 0x74, 0x61, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x69, 0x63, -0x6f, 0x73, 0x69, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x64, 0x65, 0x6c, 0x6f, -0x75, 0x70, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x69, 0x67, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, -0x2f, 0x43, 0x68, 0x69, 0x74, 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, 0x54, 0x6f, 0x72, 0x74, 0x6f, 0x6c, 0x61, 0x0, 0x41, -0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61, 0x73, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, -0x53, 0x61, 0x6b, 0x68, 0x61, 0x6c, 0x69, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x57, 0x61, 0x6b, -0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x63, 0x63, 0x72, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, -0x69, 0x63, 0x2f, 0x41, 0x75, 0x63, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 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, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, -0x2f, 0x54, 0x61, 0x68, 0x69, 0x74, 0x69, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4f, 0x75, 0x61, 0x67, 0x61, -0x64, 0x6f, 0x75, 0x67, 0x6f, 0x75, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4b, 0x65, 0x72, 0x67, 0x75, 0x65, -0x6c, 0x65, 0x6e, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x38, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, -0x2f, 0x54, 0x69, 0x72, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x69, 0x70, 0x65, 0x69, 0x0, -0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x43, 0x6f, 0x70, 0x65, 0x6e, 0x68, 0x61, 0x67, 0x65, 0x6e, 0x0, 0x41, 0x66, -0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x70, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x6f, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x6b, 0x75, 0x0, -0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x6e, 0x67, 0x5f, 0x4b, 0x6f, 0x6e, 0x67, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, -0x4a, 0x61, 0x79, 0x61, 0x70, 0x75, 0x72, 0x61, 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, 0x4e, 0x61, 0x69, 0x72, 0x6f, 0x62, 0x69, -0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x6d, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x4a, 0x75, 0x62, 0x61, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x46, 0x61, 0x65, 0x72, 0x6f, -0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x72, 0x65, 0x64, 0x6e, 0x65, 0x6b, 0x6f, 0x6c, 0x79, 0x6d, 0x73, 0x6b, -0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x69, 0x75, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x41, 0x6c, 0x67, 0x69, 0x65, 0x72, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x69, 0x6c, 0x69, 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, 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, 0x50, 0x6f, 0x64, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x44, 0x6f, 0x75, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x56, 0x69, 0x65, 0x6e, 0x74, 0x69, -0x61, 0x6e, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x69, 0x6a, 0x75, 0x61, 0x6e, 0x61, 0x20, -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, 0x4c, 0x6f, 0x6d, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, -0x52, 0x69, 0x67, 0x61, 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, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x65, 0x0, -0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x0, 0x41, 0x73, 0x69, -0x61, 0x2f, 0x54, 0x6f, 0x6b, 0x79, 0x6f, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x36, 0x0, 0x45, 0x75, -0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x72, 0x61, 0x6a, 0x65, 0x76, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, -0x2f, 0x42, 0x72, 0x61, 0x74, 0x69, 0x73, 0x6c, 0x61, 0x76, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, -0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, 0x61, 0x6e, 0x61, -0x72, 0x79, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x42, 0x6f, 0x75, 0x67, 0x61, 0x69, 0x6e, 0x76, 0x69, -0x6c, 0x6c, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x68, 0x72, 0x61, 0x69, 0x6e, 0x0, 0x41, 0x6d, 0x65, -0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, -0x63, 0x61, 0x2f, 0x4c, 0x61, 0x5f, 0x50, 0x61, 0x7a, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x79, 0x6f, 0x6e, 0x67, -0x79, 0x61, 0x6e, 0x67, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x61, 0x67, 0x6f, 0x5f, 0x50, 0x61, -0x67, 0x6f, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x52, 0x65, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x0, 0x41, 0x66, -0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x73, 0x65, 0x72, 0x75, 0x0, 0x50, 0x53, 0x54, 0x38, 0x50, 0x44, 0x54, 0x0, -0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x39, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x75, 0x6e, -0x69, 0x73, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6f, 0x5f, 0x54, 0x6f, 0x6d, 0x65, 0x0, 0x45, -0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x76, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x4b, 0x68, 0x61, 0x72, 0x74, 0x6f, 0x75, 0x6d, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4a, 0x65, 0x72, -0x73, 0x65, 0x79, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x71, 0x75, -0x61, 0x72, 0x69, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4f, 0x6a, 0x69, 0x6e, 0x61, 0x67, 0x61, -0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, 0x61, 0x70, 0x65, 0x5f, 0x56, 0x65, 0x72, 0x64, 0x65, -0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x6b, 0x61, 0x73, 0x73, 0x61, 0x72, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, -0x65, 0x2f, 0x4c, 0x6a, 0x75, 0x62, 0x6c, 0x6a, 0x61, 0x6e, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, -0x75, 0x65, 0x72, 0x6e, 0x73, 0x65, 0x79, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, -0x61, 0x77, 0x73, 0x6f, 0x6e, 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, 0x50, -0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x41, 0x70, 0x69, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, -0x61, 0x6e, 0x67, 0x75, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x6f, 0x6d, 0x73, 0x6b, 0x0, 0x50, 0x61, 0x63, -0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x61, 0x6c, 0x61, 0x75, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, -0x2f, 0x44, 0x61, 0x72, 0x77, 0x69, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x69, 0x74, 0x63, -0x61, 0x69, 0x72, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 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, 0x53, 0x61, 0x6d, 0x61, 0x72, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x50, -0x65, 0x72, 0x74, 0x68, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x57, 0x61, 0x72, 0x73, 0x61, 0x77, 0x0, 0x49, -0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x6f, 0x63, 0x6f, 0x73, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, -0x61, 0x68, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x73, 0x5f, 0x41, 0x6e, 0x67, 0x65, -0x6c, 0x65, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x74, 0x6c, 0x61, 0x6b, 0x61, 0x74, -0x6c, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x74, 0x74, 0x61, 0x0, 0x41, 0x66, 0x72, -0x69, 0x63, 0x61, 0x2f, 0x41, 0x62, 0x69, 0x64, 0x6a, 0x61, 0x6e, 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, 0x45, 0x75, 0x72, 0x6f, -0x70, 0x65, 0x2f, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x6f, 0x75, 0x72, 0x67, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x42, 0x61, 0x6d, 0x61, 0x6b, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x67, 0x61, 0x6c, -0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51, 0x61, 0x74, 0x61, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, -0x72, 0x61, 0x63, 0x68, 0x69, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x30, 0x0, 0x41, 0x66, 0x72, -0x69, 0x63, 0x61, 0x2f, 0x44, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x65, -0x6b, 0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75, 0x72, 0x67, 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, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x6f, 0x72, -0x74, 0x5f, 0x4e, 0x65, 0x6c, 0x73, 0x6f, 0x6e, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x79, 0x6f, -0x74, 0x74, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6b, 0x6f, 0x70, 0x6a, 0x65, 0x0, 0x41, 0x73, -0x69, 0x61, 0x2f, 0x53, 0x65, 0x6f, 0x75, 0x6c, 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, 0x53, 0x74, 0x6f, 0x63, 0x6b, -0x68, 0x6f, 0x6c, 0x6d, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x62, 0x75, 0x6d, 0x62, 0x61, 0x73, -0x68, 0x69, 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, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x73, 0x74, 0x72, 0x61, 0x6b, 0x68, 0x61, 0x6e, 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, 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, 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, 0x4b, 0x72, 0x61, 0x73, 0x6e, -0x6f, 0x79, 0x61, 0x72, 0x73, 0x6b, 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, 0x54, 0x69, 0x6a, 0x75, 0x61, -0x6e, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x63, 0x68, 0x61, 0x74, 0x6b, 0x61, 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, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, -0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, -0x65, 0x72, 0x6c, 0x69, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x73, 0x68, 0x6b, 0x65, 0x6e, 0x74, 0x0, -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, 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, 0x38, 0x3a, 0x33, 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_icu.cpp b/src/corelib/tools/qtimezoneprivate_icu.cpp deleted file mode 100644 index 5570ce7571..0000000000 --- a/src/corelib/tools/qtimezoneprivate_icu.cpp +++ /dev/null @@ -1,508 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 John Layt -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qtimezone.h" -#include "qtimezoneprivate_p.h" - -#include - -#include -#include - -#include - -QT_BEGIN_NAMESPACE - -/* - Private - - ICU implementation -*/ - -// ICU utilities - -// Convert TimeType and NameType into ICU UCalendarDisplayNameType -static UCalendarDisplayNameType ucalDisplayNameType(QTimeZone::TimeType timeType, QTimeZone::NameType nameType) -{ - // TODO ICU C UCalendarDisplayNameType does not support full set of C++ TimeZone::EDisplayType - switch (nameType) { - case QTimeZone::ShortName : - case QTimeZone::OffsetName : - if (timeType == QTimeZone::DaylightTime) - return UCAL_SHORT_DST; - // Includes GenericTime - return UCAL_SHORT_STANDARD; - case QTimeZone::DefaultName : - case QTimeZone::LongName : - if (timeType == QTimeZone::DaylightTime) - return UCAL_DST; - // Includes GenericTime - return UCAL_STANDARD; - } - return UCAL_STANDARD; -} - -// Qt wrapper around ucal_getDefaultTimeZone() -static QByteArray ucalDefaultTimeZoneId() -{ - int32_t size = 30; - QString result(size, Qt::Uninitialized); - UErrorCode status = U_ZERO_ERROR; - - // size = ucal_getDefaultTimeZone(result, resultLength, status) - size = ucal_getDefaultTimeZone(reinterpret_cast(result.data()), size, &status); - - // If overflow, then resize and retry - if (status == U_BUFFER_OVERFLOW_ERROR) { - result.resize(size); - status = U_ZERO_ERROR; - size = ucal_getDefaultTimeZone(reinterpret_cast(result.data()), size, &status); - } - - // If successful on first or second go, resize and return - if (U_SUCCESS(status)) { - result.resize(size); - return std::move(result).toUtf8(); - } - - return QByteArray(); -} - -// Qt wrapper around ucal_getTimeZoneDisplayName() -static QString ucalTimeZoneDisplayName(UCalendar *ucal, QTimeZone::TimeType timeType, - QTimeZone::NameType nameType, - const QString &localeCode) -{ - int32_t size = 50; - QString result(size, Qt::Uninitialized); - UErrorCode status = U_ZERO_ERROR; - - // size = ucal_getTimeZoneDisplayName(cal, type, locale, result, resultLength, status) - size = ucal_getTimeZoneDisplayName(ucal, - ucalDisplayNameType(timeType, nameType), - localeCode.toUtf8(), - reinterpret_cast(result.data()), - size, - &status); - - // If overflow, then resize and retry - if (status == U_BUFFER_OVERFLOW_ERROR) { - result.resize(size); - status = U_ZERO_ERROR; - size = ucal_getTimeZoneDisplayName(ucal, - ucalDisplayNameType(timeType, nameType), - localeCode.toUtf8(), - reinterpret_cast(result.data()), - size, - &status); - } - - // If successful on first or second go, resize and return - if (U_SUCCESS(status)) { - result.resize(size); - return result; - } - - return QString(); -} - -// Qt wrapper around ucal_get() for offsets -static bool ucalOffsetsAtTime(UCalendar *m_ucal, qint64 atMSecsSinceEpoch, - int *utcOffset, int *dstOffset) -{ - *utcOffset = 0; - *dstOffset = 0; - - // Clone the ucal so we don't change the shared object - UErrorCode status = U_ZERO_ERROR; - UCalendar *ucal = ucal_clone(m_ucal, &status); - if (!U_SUCCESS(status)) - return false; - - // Set the date to find the offset for - status = U_ZERO_ERROR; - ucal_setMillis(ucal, atMSecsSinceEpoch, &status); - - int32_t utc = 0; - if (U_SUCCESS(status)) { - status = U_ZERO_ERROR; - // Returns msecs - utc = ucal_get(ucal, UCAL_ZONE_OFFSET, &status) / 1000; - } - - int32_t dst = 0; - if (U_SUCCESS(status)) { - status = U_ZERO_ERROR; - // Returns msecs - dst = ucal_get(ucal, UCAL_DST_OFFSET, &status) / 1000; - } - - ucal_close(ucal); - if (U_SUCCESS(status)) { - *utcOffset = utc; - *dstOffset = dst; - return true; - } - return false; -} - -// ICU Draft api in v50, should be stable in ICU v51. Available in C++ api from ICU v3.8 -#if U_ICU_VERSION_MAJOR_NUM == 50 -// Qt wrapper around qt_ucal_getTimeZoneTransitionDate & ucal_get -static QTimeZonePrivate::Data ucalTimeZoneTransition(UCalendar *m_ucal, - UTimeZoneTransitionType type, - qint64 atMSecsSinceEpoch) -{ - QTimeZonePrivate::Data tran = QTimeZonePrivate::invalidData(); - - // Clone the ucal so we don't change the shared object - UErrorCode status = U_ZERO_ERROR; - UCalendar *ucal = ucal_clone(m_ucal, &status); - if (!U_SUCCESS(status)) - return tran; - - // Set the date to find the transition for - status = U_ZERO_ERROR; - ucal_setMillis(ucal, atMSecsSinceEpoch, &status); - - // Find the transition time - UDate tranMSecs = 0; - status = U_ZERO_ERROR; - bool ok = ucal_getTimeZoneTransitionDate(ucal, type, &tranMSecs, &status); - - // Set the transition time to find the offsets for - if (U_SUCCESS(status) && ok) { - status = U_ZERO_ERROR; - ucal_setMillis(ucal, tranMSecs, &status); - } - - int32_t utc = 0; - if (U_SUCCESS(status) && ok) { - status = U_ZERO_ERROR; - utc = ucal_get(ucal, UCAL_ZONE_OFFSET, &status) / 1000; - } - - int32_t dst = 0; - if (U_SUCCESS(status) && ok) { - status = U_ZERO_ERROR; - dst = ucal_get(ucal, UCAL_DST_OFFSET, &status) / 1000; - } - - ucal_close(ucal); - if (!U_SUCCESS(status) || !ok) - return tran; - tran.atMSecsSinceEpoch = tranMSecs; - tran.offsetFromUtc = utc + dst; - tran.standardTimeOffset = utc; - tran.daylightTimeOffset = dst; - // TODO No ICU API, use short name instead - if (dst == 0) - tran.abbreviation = ucalTimeZoneDisplayName(m_ucal, QTimeZone::StandardTime, - QTimeZone::ShortName, QLocale().name()); - else - tran.abbreviation = ucalTimeZoneDisplayName(m_ucal, QTimeZone::DaylightTime, - QTimeZone::ShortName, QLocale().name()); - return tran; -} -#endif // U_ICU_VERSION_SHORT - -// Convert a uenum to a QList -static QList uenumToIdList(UEnumeration *uenum) -{ - QList list; - int32_t size = 0; - UErrorCode status = U_ZERO_ERROR; - // TODO Perhaps use uenum_unext instead? - QByteArray result = uenum_next(uenum, &size, &status); - while (U_SUCCESS(status) && !result.isEmpty()) { - list << result; - status = U_ZERO_ERROR; - result = uenum_next(uenum, &size, &status); - } - std::sort(list.begin(), list.end()); - list.erase(std::unique(list.begin(), list.end()), list.end()); - return list; -} - -// Qt wrapper around ucal_getDSTSavings() -static int ucalDaylightOffset(const QByteArray &id) -{ - UErrorCode status = U_ZERO_ERROR; - const int32_t dstMSecs = ucal_getDSTSavings(reinterpret_cast(id.data()), &status); - if (U_SUCCESS(status)) - return (dstMSecs / 1000); - else - return 0; -} - -// Create the system default time zone -QIcuTimeZonePrivate::QIcuTimeZonePrivate() - : m_ucal(0) -{ - // TODO No ICU C API to obtain sysem tz, assume default hasn't been changed - init(ucalDefaultTimeZoneId()); -} - -// Create a named time zone -QIcuTimeZonePrivate::QIcuTimeZonePrivate(const QByteArray &ianaId) - : m_ucal(0) -{ - // Need to check validity here as ICu will create a GMT tz if name is invalid - if (availableTimeZoneIds().contains(ianaId)) - init(ianaId); -} - -QIcuTimeZonePrivate::QIcuTimeZonePrivate(const QIcuTimeZonePrivate &other) - : QTimeZonePrivate(other), m_ucal(0) -{ - // Clone the ucal so we don't close the shared object - UErrorCode status = U_ZERO_ERROR; - m_ucal = ucal_clone(other.m_ucal, &status); - if (!U_SUCCESS(status)) { - m_id.clear(); - m_ucal = 0; - } -} - -QIcuTimeZonePrivate::~QIcuTimeZonePrivate() -{ - ucal_close(m_ucal); -} - -QIcuTimeZonePrivate *QIcuTimeZonePrivate::clone() const -{ - return new QIcuTimeZonePrivate(*this); -} - -void QIcuTimeZonePrivate::init(const QByteArray &ianaId) -{ - m_id = ianaId; - - const QString id = QString::fromUtf8(m_id); - UErrorCode status = U_ZERO_ERROR; - //TODO Use UCAL_GREGORIAN for now to match QLocale, change to UCAL_DEFAULT once full ICU support - m_ucal = ucal_open(reinterpret_cast(id.data()), id.size(), - QLocale().name().toUtf8(), UCAL_GREGORIAN, &status); - - if (!U_SUCCESS(status)) { - m_id.clear(); - m_ucal = 0; - } -} - -QString QIcuTimeZonePrivate::displayName(QTimeZone::TimeType timeType, - QTimeZone::NameType nameType, - const QLocale &locale) const -{ - // Return standard offset format name as ICU C api doesn't support it yet - if (nameType == QTimeZone::OffsetName) { - const Data nowData = data(QDateTime::currentMSecsSinceEpoch()); - // We can't use transitions reliably to find out right dst offset - // Instead use dst offset api to try get it if needed - if (timeType == QTimeZone::DaylightTime) - return isoOffsetFormat(nowData.standardTimeOffset + ucalDaylightOffset(m_id)); - else - return isoOffsetFormat(nowData.standardTimeOffset); - } - return ucalTimeZoneDisplayName(m_ucal, timeType, nameType, locale.name()); -} - -QString QIcuTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const -{ - // TODO No ICU API, use short name instead - if (isDaylightTime(atMSecsSinceEpoch)) - return displayName(QTimeZone::DaylightTime, QTimeZone::ShortName, QString()); - else - return displayName(QTimeZone::StandardTime, QTimeZone::ShortName, QString()); -} - -int QIcuTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const -{ - int stdOffset = 0; - int dstOffset = 0; - ucalOffsetsAtTime(m_ucal, atMSecsSinceEpoch, &stdOffset, & dstOffset); - return stdOffset + dstOffset; -} - -int QIcuTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const -{ - int stdOffset = 0; - int dstOffset = 0; - ucalOffsetsAtTime(m_ucal, atMSecsSinceEpoch, &stdOffset, & dstOffset); - return stdOffset; -} - -int QIcuTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const -{ - int stdOffset = 0; - int dstOffset = 0; - ucalOffsetsAtTime(m_ucal, atMSecsSinceEpoch, &stdOffset, & dstOffset); - return dstOffset; -} - -bool QIcuTimeZonePrivate::hasDaylightTime() const -{ - // TODO No direct ICU C api, work-around below not reliable? Find a better way? - return (ucalDaylightOffset(m_id) != 0); -} - -bool QIcuTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const -{ - // Clone the ucal so we don't change the shared object - UErrorCode status = U_ZERO_ERROR; - UCalendar *ucal = ucal_clone(m_ucal, &status); - if (!U_SUCCESS(status)) - return false; - - // Set the date to find the offset for - status = U_ZERO_ERROR; - ucal_setMillis(ucal, atMSecsSinceEpoch, &status); - - bool result = false; - if (U_SUCCESS(status)) { - status = U_ZERO_ERROR; - result = ucal_inDaylightTime(ucal, &status); - } - - ucal_close(ucal); - return result; -} - -QTimeZonePrivate::Data QIcuTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const -{ - // Available in ICU C++ api, and draft C api in v50 - // TODO When v51 released see if api is stable - QTimeZonePrivate::Data data = invalidData(); -#if U_ICU_VERSION_MAJOR_NUM == 50 - data = ucalTimeZoneTransition(m_ucal, UCAL_TZ_TRANSITION_PREVIOUS_INCLUSIVE, - forMSecsSinceEpoch); -#else - ucalOffsetsAtTime(m_ucal, forMSecsSinceEpoch, &data.standardTimeOffset, - &data.daylightTimeOffset); - data.offsetFromUtc = data.standardTimeOffset + data.daylightTimeOffset; - data.abbreviation = abbreviation(forMSecsSinceEpoch); -#endif // U_ICU_VERSION_MAJOR_NUM == 50 - data.atMSecsSinceEpoch = forMSecsSinceEpoch; - return data; -} - -bool QIcuTimeZonePrivate::hasTransitions() const -{ - // Available in ICU C++ api, and draft C api in v50 - // TODO When v51 released see if api is stable -#if U_ICU_VERSION_MAJOR_NUM == 50 - return true; -#else - return false; -#endif // U_ICU_VERSION_MAJOR_NUM == 50 -} - -QTimeZonePrivate::Data QIcuTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const -{ - // Available in ICU C++ api, and draft C api in v50 - // TODO When v51 released see if api is stable -#if U_ICU_VERSION_MAJOR_NUM == 50 - return ucalTimeZoneTransition(m_ucal, UCAL_TZ_TRANSITION_NEXT, afterMSecsSinceEpoch); -#else - Q_UNUSED(afterMSecsSinceEpoch) - return invalidData(); -#endif // U_ICU_VERSION_MAJOR_NUM == 50 -} - -QTimeZonePrivate::Data QIcuTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const -{ - // Available in ICU C++ api, and draft C api in v50 - // TODO When v51 released see if api is stable -#if U_ICU_VERSION_MAJOR_NUM == 50 - return ucalTimeZoneTransition(m_ucal, UCAL_TZ_TRANSITION_PREVIOUS, beforeMSecsSinceEpoch); -#else - Q_UNUSED(beforeMSecsSinceEpoch) - return invalidData(); -#endif // U_ICU_VERSION_MAJOR_NUM == 50 -} - -QByteArray QIcuTimeZonePrivate::systemTimeZoneId() const -{ - // No ICU C API to obtain sysem tz - // TODO Assume default hasn't been changed and is the latests system - return ucalDefaultTimeZoneId(); -} - -QList QIcuTimeZonePrivate::availableTimeZoneIds() const -{ - UErrorCode status = U_ZERO_ERROR; - UEnumeration *uenum = ucal_openTimeZones(&status); - QList result; - if (U_SUCCESS(status)) - result = uenumToIdList(uenum); - uenum_close(uenum); - return result; -} - -QList QIcuTimeZonePrivate::availableTimeZoneIds(QLocale::Country country) const -{ - const QLatin1String regionCode = QLocalePrivate::countryToCode(country); - const QByteArray regionCodeUtf8 = QString(regionCode).toUtf8(); - UErrorCode status = U_ZERO_ERROR; - UEnumeration *uenum = ucal_openCountryTimeZones(regionCodeUtf8.data(), &status); - QList result; - if (U_SUCCESS(status)) - result = uenumToIdList(uenum); - uenum_close(uenum); - return result; -} - -QList QIcuTimeZonePrivate::availableTimeZoneIds(int offsetFromUtc) const -{ -// TODO Available directly in C++ api but not C api, from 4.8 onwards new filter method works -#if U_ICU_VERSION_MAJOR_NUM >= 49 || (U_ICU_VERSION_MAJOR_NUM == 4 && U_ICU_VERSION_MINOR_NUM == 8) - UErrorCode status = U_ZERO_ERROR; - UEnumeration *uenum = ucal_openTimeZoneIDEnumeration(UCAL_ZONE_TYPE_ANY, 0, - &offsetFromUtc, &status); - QList result; - if (U_SUCCESS(status)) - result = uenumToIdList(uenum); - uenum_close(uenum); - return result; -#else - return QTimeZonePrivate::availableTimeZoneIds(offsetFromUtc); -#endif -} - -QT_END_NAMESPACE diff --git a/src/corelib/tools/qtimezoneprivate_mac.mm b/src/corelib/tools/qtimezoneprivate_mac.mm deleted file mode 100644 index d3c4fbe5da..0000000000 --- a/src/corelib/tools/qtimezoneprivate_mac.mm +++ /dev/null @@ -1,333 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 John Layt -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qtimezone.h" -#include "qtimezoneprivate_p.h" - -#include "private/qcore_mac_p.h" -#include "qstringlist.h" - -#include - -#include - -#include - -QT_BEGIN_NAMESPACE - -/* - Private - - OS X system implementation -*/ - -// Create the system default time zone -QMacTimeZonePrivate::QMacTimeZonePrivate() - : m_nstz(0) -{ - init(systemTimeZoneId()); -} - -// Create a named time zone -QMacTimeZonePrivate::QMacTimeZonePrivate(const QByteArray &ianaId) - : m_nstz(0) -{ - init(ianaId); -} - -QMacTimeZonePrivate::QMacTimeZonePrivate(const QMacTimeZonePrivate &other) - : QTimeZonePrivate(other), m_nstz(0) -{ - m_nstz = [other.m_nstz copy]; -} - -QMacTimeZonePrivate::~QMacTimeZonePrivate() -{ - [m_nstz release]; -} - -QMacTimeZonePrivate *QMacTimeZonePrivate::clone() const -{ - return new QMacTimeZonePrivate(*this); -} - -void QMacTimeZonePrivate::init(const QByteArray &ianaId) -{ - if (availableTimeZoneIds().contains(ianaId)) { - m_nstz = [[NSTimeZone timeZoneWithName:QString::fromUtf8(ianaId).toNSString()] retain]; - if (m_nstz) - m_id = ianaId; - } -} - -QString QMacTimeZonePrivate::comment() const -{ - return QString::fromNSString([m_nstz description]); -} - -QString QMacTimeZonePrivate::displayName(QTimeZone::TimeType timeType, - QTimeZone::NameType nameType, - const QLocale &locale) const -{ - // TODO Mac doesn't support OffsetName yet so use standard offset name - if (nameType == QTimeZone::OffsetName) { - const Data nowData = data(QDateTime::currentMSecsSinceEpoch()); - // TODO Cheat for now, assume if has dst the offset if 1 hour - if (timeType == QTimeZone::DaylightTime && hasDaylightTime()) - return isoOffsetFormat(nowData.standardTimeOffset + 3600); - else - return isoOffsetFormat(nowData.standardTimeOffset); - } - - NSTimeZoneNameStyle style = NSTimeZoneNameStyleStandard; - - switch (nameType) { - case QTimeZone::ShortName : - if (timeType == QTimeZone::DaylightTime) - style = NSTimeZoneNameStyleShortDaylightSaving; - else if (timeType == QTimeZone::GenericTime) - style = NSTimeZoneNameStyleShortGeneric; - else - style = NSTimeZoneNameStyleShortStandard; - break; - case QTimeZone::DefaultName : - case QTimeZone::LongName : - if (timeType == QTimeZone::DaylightTime) - style = NSTimeZoneNameStyleDaylightSaving; - else if (timeType == QTimeZone::GenericTime) - style = NSTimeZoneNameStyleGeneric; - else - style = NSTimeZoneNameStyleStandard; - break; - case QTimeZone::OffsetName : - // Unreachable - break; - } - - NSString *macLocaleCode = locale.name().toNSString(); - NSLocale *macLocale = [[NSLocale alloc] initWithLocaleIdentifier:macLocaleCode]; - const QString result = QString::fromNSString([m_nstz localizedName:style locale:macLocale]); - [macLocale release]; - return result; -} - -QString QMacTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const -{ - const NSTimeInterval seconds = atMSecsSinceEpoch / 1000.0; - return QString::fromNSString([m_nstz abbreviationForDate:[NSDate dateWithTimeIntervalSince1970:seconds]]); -} - -int QMacTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const -{ - const NSTimeInterval seconds = atMSecsSinceEpoch / 1000.0; - return [m_nstz secondsFromGMTForDate:[NSDate dateWithTimeIntervalSince1970:seconds]]; -} - -int QMacTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const -{ - return offsetFromUtc(atMSecsSinceEpoch) - daylightTimeOffset(atMSecsSinceEpoch); -} - -int QMacTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const -{ - const NSTimeInterval seconds = atMSecsSinceEpoch / 1000.0; - return [m_nstz daylightSavingTimeOffsetForDate:[NSDate dateWithTimeIntervalSince1970:seconds]]; -} - -bool QMacTimeZonePrivate::hasDaylightTime() const -{ - // TODO No Mac API, assume if has transitions - return hasTransitions(); -} - -bool QMacTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const -{ - const NSTimeInterval seconds = atMSecsSinceEpoch / 1000.0; - return [m_nstz isDaylightSavingTimeForDate:[NSDate dateWithTimeIntervalSince1970:seconds]]; -} - -QTimeZonePrivate::Data QMacTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const -{ - const NSTimeInterval seconds = forMSecsSinceEpoch / 1000.0; - NSDate *date = [NSDate dateWithTimeIntervalSince1970:seconds]; - Data data; - data.atMSecsSinceEpoch = forMSecsSinceEpoch; - data.offsetFromUtc = [m_nstz secondsFromGMTForDate:date]; - data.daylightTimeOffset = [m_nstz daylightSavingTimeOffsetForDate:date]; - data.standardTimeOffset = data.offsetFromUtc - data.daylightTimeOffset; - data.abbreviation = QString::fromNSString([m_nstz abbreviationForDate:date]); - return data; -} - -bool QMacTimeZonePrivate::hasTransitions() const -{ - // TODO No direct Mac API, so return if has next after 1970, i.e. since start of tz - // TODO Not sure what is returned in event of no transitions, assume will be before requested date - NSDate *epoch = [NSDate dateWithTimeIntervalSince1970:0]; - const NSDate *date = [m_nstz nextDaylightSavingTimeTransitionAfterDate:epoch]; - const bool result = ([date timeIntervalSince1970] > [epoch timeIntervalSince1970]); - return result; -} - -QTimeZonePrivate::Data QMacTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const -{ - QTimeZonePrivate::Data tran; - const NSTimeInterval seconds = afterMSecsSinceEpoch / 1000.0; - NSDate *nextDate = [NSDate dateWithTimeIntervalSince1970:seconds]; - nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate]; - const NSTimeInterval nextSecs = [nextDate timeIntervalSince1970]; - if (nextDate == nil || nextSecs <= seconds) { - [nextDate release]; - return invalidData(); - } - tran.atMSecsSinceEpoch = nextSecs * 1000; - tran.offsetFromUtc = [m_nstz secondsFromGMTForDate:nextDate]; - tran.daylightTimeOffset = [m_nstz daylightSavingTimeOffsetForDate:nextDate]; - tran.standardTimeOffset = tran.offsetFromUtc - tran.daylightTimeOffset; - tran.abbreviation = QString::fromNSString([m_nstz abbreviationForDate:nextDate]); - return tran; -} - -QTimeZonePrivate::Data QMacTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const -{ - // The native API only lets us search forward, so we need to find an early-enough start: - const NSTimeInterval lowerBound = std::numeric_limits::lowest(); - const qint64 endSecs = beforeMSecsSinceEpoch / 1000; - const int year = 366 * 24 * 3600; // a (long) year, in seconds - NSTimeInterval prevSecs = endSecs; // sentinel for later check - NSTimeInterval nextSecs = prevSecs - year; - NSTimeInterval tranSecs = lowerBound; // time at a transition; may be > endSecs - - NSDate *nextDate = [NSDate dateWithTimeIntervalSince1970:nextSecs]; - nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate]; - if (nextDate != nil - && (tranSecs = [nextDate timeIntervalSince1970]) < endSecs) { - // There's a transition within the last year before endSecs: - nextSecs = tranSecs; - } else { - // Need to start our search earlier: - nextDate = [NSDate dateWithTimeIntervalSince1970:lowerBound]; - nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate]; - if (nextDate != nil) { - NSTimeInterval lateSecs = nextSecs; - nextSecs = [nextDate timeIntervalSince1970]; - Q_ASSERT(nextSecs <= endSecs - year || nextSecs == tranSecs); - /* - We're looking at the first ever transition for our zone, at - nextSecs (and our zone *does* have at least one transition). If - it's later than endSecs - year, then we must have found it on the - initial check and therefore set tranSecs to the same transition - time (which, we can infer here, is >= endSecs). In this case, we - won't enter the binary-chop loop, below. - - In the loop, nextSecs < lateSecs < endSecs: we have a transition - at nextSecs and there is no transition between lateSecs and - endSecs. The loop narrows the interval between nextSecs and - lateSecs by looking for a transition after their mid-point; if it - finds one < endSecs, nextSecs moves to this transition; otherwise, - lateSecs moves to the mid-point. This soon enough narrows the gap - to within a year, after which walking forward one transition at a - time (the "Wind through" loop, below) is good enough. - */ - - // Binary chop to within a year of last transition before endSecs: - while (nextSecs + year < lateSecs) { - // Careful about overflow, not fussy about rounding errors: - NSTimeInterval middle = nextSecs / 2 + lateSecs / 2; - NSDate *split = [NSDate dateWithTimeIntervalSince1970:middle]; - split = [m_nstz nextDaylightSavingTimeTransitionAfterDate:split]; - if (split != nil - && (tranSecs = [split timeIntervalSince1970]) < endSecs) { - nextDate = split; - nextSecs = tranSecs; - } else { - lateSecs = middle; - } - } - Q_ASSERT(nextDate != nil); - // ... and nextSecs < endSecs unless first transition ever was >= endSecs. - } // else: we have no data - prevSecs is still endSecs, nextDate is still nil - } - // Either nextDate is nil or nextSecs is at its transition. - - // Wind through remaining transitions (spanning at most a year), one at a time: - while (nextDate != nil && nextSecs < endSecs) { - prevSecs = nextSecs; - nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate]; - nextSecs = [nextDate timeIntervalSince1970]; - if (nextSecs <= prevSecs) // presumably no later data available - break; - } - if (prevSecs < endSecs) // i.e. we did make it into that while loop - return data(qint64(prevSecs * 1e3)); - - // No transition data; or first transition later than requested time. - return invalidData(); -} - -QByteArray QMacTimeZonePrivate::systemTimeZoneId() const -{ - // Reset the cached system tz then return the name - [NSTimeZone resetSystemTimeZone]; - return QString::fromNSString([[NSTimeZone systemTimeZone] name]).toUtf8(); -} - -QList QMacTimeZonePrivate::availableTimeZoneIds() const -{ - NSEnumerator *enumerator = [[NSTimeZone knownTimeZoneNames] objectEnumerator]; - QByteArray tzid = QString::fromNSString([enumerator nextObject]).toUtf8(); - - QList list; - while (!tzid.isEmpty()) { - list << tzid; - tzid = QString::fromNSString([enumerator nextObject]).toUtf8(); - } - - std::sort(list.begin(), list.end()); - list.erase(std::unique(list.begin(), list.end()), list.end()); - - return list; -} - -NSTimeZone *QMacTimeZonePrivate::nsTimeZone() const -{ - return m_nstz; -} - -QT_END_NAMESPACE diff --git a/src/corelib/tools/qtimezoneprivate_p.h b/src/corelib/tools/qtimezoneprivate_p.h deleted file mode 100644 index b5e9286f6a..0000000000 --- a/src/corelib/tools/qtimezoneprivate_p.h +++ /dev/null @@ -1,493 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 John Layt -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.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" -#include "qvector.h" - -#if QT_CONFIG(icu) -#include -#endif - -#ifdef Q_OS_DARWIN -Q_FORWARD_DECLARE_OBJC_CLASS(NSTimeZone); -#endif // Q_OS_DARWIN - -#ifdef Q_OS_WIN -#include -#endif // Q_OS_WIN - -#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED) -#include -#endif - -QT_BEGIN_NAMESPACE - -class Q_AUTOTEST_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 DataList; - - // Create null time zone - QTimeZonePrivate(); - QTimeZonePrivate(const QTimeZonePrivate &other); - virtual ~QTimeZonePrivate(); - - virtual QTimeZonePrivate *clone() const; - - 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; - Data dataForLocalTime(qint64 forLocalMSecs, int hint) 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 bool isTimeZoneIdAvailable(const QByteArray &ianaId) const; - virtual QList availableTimeZoneIds() const; - virtual QList availableTimeZoneIds(QLocale::Country country) const; - virtual QList availableTimeZoneIds(int utcOffset) const; - - virtual void serialize(QDataStream &ds) const; - - // Static Utility Methods - static inline qint64 maxMSecs() { return std::numeric_limits::max(); } - static inline qint64 minMSecs() { return std::numeric_limits::min() + 1; } - static inline qint64 invalidMSecs() { return std::numeric_limits::min(); } - static inline qint64 invalidSeconds() { return std::numeric_limits::min(); } - static Data invalidData(); - static QTimeZone::OffsetData invalidOffsetData(); - static QTimeZone::OffsetData toOffsetData(const Data &data); - static bool isValidId(const QByteArray &ianaId); - static QString isoOffsetFormat(int offsetFromUtc); - - static QByteArray ianaIdToWindowsId(const QByteArray &ianaId); - static QByteArray windowsIdToDefaultIanaId(const QByteArray &windowsId); - static QByteArray windowsIdToDefaultIanaId(const QByteArray &windowsId, - QLocale::Country country); - static QList windowsIdToIanaIds(const QByteArray &windowsId); - static QList windowsIdToIanaIds(const QByteArray &windowsId, - QLocale::Country country); - - // returns "UTC" QString and QByteArray - Q_REQUIRED_RESULT static inline QString utcQString() - { - return QStringLiteral("UTC"); - } - - Q_REQUIRED_RESULT static inline QByteArray utcQByteArray() - { - return QByteArrayLiteral("UTC"); - } - -protected: - QByteArray m_id; -}; -Q_DECLARE_TYPEINFO(QTimeZonePrivate::Data, Q_MOVABLE_TYPE); - -template<> QTimeZonePrivate *QSharedDataPointer::clone(); - -class Q_AUTOTEST_EXPORT QUtcTimeZonePrivate 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(); - - QUtcTimeZonePrivate *clone() const override; - - Data data(qint64 forMSecsSinceEpoch) const override; - - QLocale::Country country() const override; - QString comment() const override; - - QString displayName(QTimeZone::TimeType timeType, - QTimeZone::NameType nameType, - const QLocale &locale) const override; - QString abbreviation(qint64 atMSecsSinceEpoch) const override; - - int standardTimeOffset(qint64 atMSecsSinceEpoch) const override; - int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override; - - QByteArray systemTimeZoneId() const override; - - bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override; - QList availableTimeZoneIds() const override; - QList availableTimeZoneIds(QLocale::Country country) const override; - QList availableTimeZoneIds(int utcOffset) const override; - - void serialize(QDataStream &ds) const 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); - - QString m_name; - QString m_abbreviation; - QString m_comment; - QLocale::Country m_country; - int m_offsetFromUtc; -}; - -#if QT_CONFIG(icu) -class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate final : public QTimeZonePrivate -{ -public: - // Create default time zone - QIcuTimeZonePrivate(); - // Create named time zone - QIcuTimeZonePrivate(const QByteArray &ianaId); - QIcuTimeZonePrivate(const QIcuTimeZonePrivate &other); - ~QIcuTimeZonePrivate(); - - QIcuTimeZonePrivate *clone() const override; - - QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType, - const QLocale &locale) const override; - QString abbreviation(qint64 atMSecsSinceEpoch) const override; - - int offsetFromUtc(qint64 atMSecsSinceEpoch) const override; - int standardTimeOffset(qint64 atMSecsSinceEpoch) const override; - int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override; - - bool hasDaylightTime() const override; - bool isDaylightTime(qint64 atMSecsSinceEpoch) const override; - - Data data(qint64 forMSecsSinceEpoch) const override; - - bool hasTransitions() const override; - Data nextTransition(qint64 afterMSecsSinceEpoch) const override; - Data previousTransition(qint64 beforeMSecsSinceEpoch) const override; - - QByteArray systemTimeZoneId() const override; - - QList availableTimeZoneIds() const override; - QList availableTimeZoneIds(QLocale::Country country) const override; - QList availableTimeZoneIds(int offsetFromUtc) const override; - -private: - void init(const QByteArray &ianaId); - - UCalendar *m_ucal; -}; -#endif - -#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_EMBEDDED)) -struct QTzTransitionTime -{ - qint64 atMSecsSinceEpoch; - quint8 ruleIndex; -}; -Q_DECLARE_TYPEINFO(QTzTransitionTime, Q_PRIMITIVE_TYPE); -struct QTzTransitionRule -{ - int stdOffset; - int dstOffset; - quint8 abbreviationIndex; -}; -Q_DECLARE_TYPEINFO(QTzTransitionRule, Q_PRIMITIVE_TYPE); -Q_DECL_CONSTEXPR inline bool operator==(const QTzTransitionRule &lhs, const QTzTransitionRule &rhs) noexcept -{ return lhs.stdOffset == rhs.stdOffset && lhs.dstOffset == rhs.dstOffset && lhs.abbreviationIndex == rhs.abbreviationIndex; } -Q_DECL_CONSTEXPR inline bool operator!=(const QTzTransitionRule &lhs, const QTzTransitionRule &rhs) noexcept -{ return !operator==(lhs, rhs); } - -class Q_AUTOTEST_EXPORT QTzTimeZonePrivate final : public QTimeZonePrivate -{ - QTzTimeZonePrivate(const QTzTimeZonePrivate &) = default; -public: - // Create default time zone - QTzTimeZonePrivate(); - // Create named time zone - QTzTimeZonePrivate(const QByteArray &ianaId); - ~QTzTimeZonePrivate(); - - QTzTimeZonePrivate *clone() const override; - - QLocale::Country country() const override; - QString comment() const override; - - QString displayName(qint64 atMSecsSinceEpoch, - QTimeZone::NameType nameType, - const QLocale &locale) const override; - QString displayName(QTimeZone::TimeType timeType, - QTimeZone::NameType nameType, - const QLocale &locale) const override; - QString abbreviation(qint64 atMSecsSinceEpoch) const override; - - int offsetFromUtc(qint64 atMSecsSinceEpoch) const override; - int standardTimeOffset(qint64 atMSecsSinceEpoch) const override; - int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override; - - bool hasDaylightTime() const override; - bool isDaylightTime(qint64 atMSecsSinceEpoch) const override; - - Data data(qint64 forMSecsSinceEpoch) const override; - - bool hasTransitions() const override; - Data nextTransition(qint64 afterMSecsSinceEpoch) const override; - Data previousTransition(qint64 beforeMSecsSinceEpoch) const override; - - QByteArray systemTimeZoneId() const override; - - bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override; - QList availableTimeZoneIds() const override; - QList availableTimeZoneIds(QLocale::Country country) const override; - -private: - void init(const QByteArray &ianaId); - QVector getPosixTransitions(qint64 msNear) const; - - Data dataForTzTransition(QTzTransitionTime tran) const; - QVector m_tranTimes; - QVector m_tranRules; - QList m_abbreviations; -#if QT_CONFIG(icu) - mutable QSharedDataPointer m_icu; -#endif - QByteArray m_posixRule; -}; -#endif // Q_OS_UNIX - -#ifdef Q_OS_MAC -class Q_AUTOTEST_EXPORT QMacTimeZonePrivate final : public QTimeZonePrivate -{ -public: - // Create default time zone - QMacTimeZonePrivate(); - // Create named time zone - QMacTimeZonePrivate(const QByteArray &ianaId); - QMacTimeZonePrivate(const QMacTimeZonePrivate &other); - ~QMacTimeZonePrivate(); - - QMacTimeZonePrivate *clone() const override; - - QString comment() const override; - - QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType, - const QLocale &locale) const override; - QString abbreviation(qint64 atMSecsSinceEpoch) const override; - - int offsetFromUtc(qint64 atMSecsSinceEpoch) const override; - int standardTimeOffset(qint64 atMSecsSinceEpoch) const override; - int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override; - - bool hasDaylightTime() const override; - bool isDaylightTime(qint64 atMSecsSinceEpoch) const override; - - Data data(qint64 forMSecsSinceEpoch) const override; - - bool hasTransitions() const override; - Data nextTransition(qint64 afterMSecsSinceEpoch) const override; - Data previousTransition(qint64 beforeMSecsSinceEpoch) const override; - - QByteArray systemTimeZoneId() const override; - - QList availableTimeZoneIds() const override; - - NSTimeZone *nsTimeZone() const; - -private: - void init(const QByteArray &zoneId); - - NSTimeZone *m_nstz; -}; -#endif // Q_OS_MAC - -#ifdef Q_OS_WIN -class Q_AUTOTEST_EXPORT QWinTimeZonePrivate final : public QTimeZonePrivate -{ -public: - struct QWinTransitionRule { - int startYear; - int standardTimeBias; - int daylightTimeBias; - SYSTEMTIME standardTimeRule; - SYSTEMTIME daylightTimeRule; - }; - - // Create default time zone - QWinTimeZonePrivate(); - // Create named time zone - QWinTimeZonePrivate(const QByteArray &ianaId); - QWinTimeZonePrivate(const QWinTimeZonePrivate &other); - ~QWinTimeZonePrivate(); - - QWinTimeZonePrivate *clone() const override; - - QString comment() const override; - - QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType, - const QLocale &locale) const override; - QString abbreviation(qint64 atMSecsSinceEpoch) const override; - - int offsetFromUtc(qint64 atMSecsSinceEpoch) const override; - int standardTimeOffset(qint64 atMSecsSinceEpoch) const override; - int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override; - - bool hasDaylightTime() const override; - bool isDaylightTime(qint64 atMSecsSinceEpoch) const override; - - Data data(qint64 forMSecsSinceEpoch) const override; - - bool hasTransitions() const override; - Data nextTransition(qint64 afterMSecsSinceEpoch) const override; - Data previousTransition(qint64 beforeMSecsSinceEpoch) const override; - - QByteArray systemTimeZoneId() const override; - - QList availableTimeZoneIds() const override; - -private: - void init(const QByteArray &ianaId); - QTimeZonePrivate::Data ruleToData(const QWinTransitionRule &rule, qint64 atMSecsSinceEpoch, - QTimeZone::TimeType type, bool fakeDst = false) const; - - QByteArray m_windowsId; - QString m_displayName; - QString m_standardName; - QString m_daylightName; - QList m_tranRules; -}; -#endif // Q_OS_WIN - -#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED) -class QAndroidTimeZonePrivate final : public QTimeZonePrivate -{ -public: - // Create default time zone - QAndroidTimeZonePrivate(); - // Create named time zone - QAndroidTimeZonePrivate(const QByteArray &ianaId); - QAndroidTimeZonePrivate(const QAndroidTimeZonePrivate &other); - ~QAndroidTimeZonePrivate(); - - QAndroidTimeZonePrivate *clone() const override; - - QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType, - const QLocale &locale) const override; - QString abbreviation(qint64 atMSecsSinceEpoch) const override; - - int offsetFromUtc(qint64 atMSecsSinceEpoch) const override; - int standardTimeOffset(qint64 atMSecsSinceEpoch) const override; - int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override; - - bool hasDaylightTime() const override; - bool isDaylightTime(qint64 atMSecsSinceEpoch) const override; - - Data data(qint64 forMSecsSinceEpoch) const override; - - bool hasTransitions() const override; - Data nextTransition(qint64 afterMSecsSinceEpoch) const override; - Data previousTransition(qint64 beforeMSecsSinceEpoch) const override; - - QByteArray systemTimeZoneId() const override; - - QList availableTimeZoneIds() const override; - -private: - void init(const QByteArray &zoneId); - - QJNIObjectPrivate androidTimeZone; - -}; -#endif // Q_OS_ANDROID - -QT_END_NAMESPACE - -#endif // QTIMEZONEPRIVATE_P_H diff --git a/src/corelib/tools/qtimezoneprivate_tz.cpp b/src/corelib/tools/qtimezoneprivate_tz.cpp deleted file mode 100644 index f5440799ab..0000000000 --- a/src/corelib/tools/qtimezoneprivate_tz.cpp +++ /dev/null @@ -1,1155 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 John Layt -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qtimezone.h" -#include "qtimezoneprivate_p.h" -#include "qdatetime_p.h" // ### Qt 5.14: remove once YearRange is on QDateTime - -#include -#include -#include -#include - -#include - -#include "qlocale_tools_p.h" - -#include - -QT_BEGIN_NAMESPACE - -/* - Private - - tz file implementation -*/ - -struct QTzTimeZone { - QLocale::Country country; - QByteArray comment; -}; - -// Define as a type as Q_GLOBAL_STATIC doesn't like it -typedef QHash QTzTimeZoneHash; - -// Parse zone.tab table, assume lists all installed zones, if not will need to read directories -static QTzTimeZoneHash loadTzTimeZones() -{ - QString path = QStringLiteral("/usr/share/zoneinfo/zone.tab"); - if (!QFile::exists(path)) - path = QStringLiteral("/usr/lib/zoneinfo/zone.tab"); - - QFile tzif(path); - if (!tzif.open(QIODevice::ReadOnly)) - return QTzTimeZoneHash(); - - QTzTimeZoneHash zonesHash; - // TODO QTextStream inefficient, replace later - QTextStream ts(&tzif); - while (!ts.atEnd()) { - const QString line = ts.readLine(); - // Comment lines are prefixed with a # - if (!line.isEmpty() && line.at(0) != '#') { - // Data rows are tab-separated columns Region, Coordinates, ID, Optional Comments - const auto parts = line.splitRef(QLatin1Char('\t')); - QTzTimeZone zone; - zone.country = QLocalePrivate::codeToCountry(parts.at(0)); - if (parts.size() > 3) - zone.comment = parts.at(3).toUtf8(); - zonesHash.insert(parts.at(2).toUtf8(), zone); - } - } - return zonesHash; -} - -// Hash of available system tz files as loaded by loadTzTimeZones() -Q_GLOBAL_STATIC_WITH_ARGS(const QTzTimeZoneHash, tzZones, (loadTzTimeZones())); - -/* - The following is copied and modified from tzfile.h which is in the public domain. - Copied as no compatibility guarantee and is never system installed. - See https://github.com/eggert/tz/blob/master/tzfile.h -*/ - -#define TZ_MAGIC "TZif" -#define TZ_MAX_TIMES 1200 -#define TZ_MAX_TYPES 256 // Limited by what (unsigned char)'s can hold -#define TZ_MAX_CHARS 50 // Maximum number of abbreviation characters -#define TZ_MAX_LEAPS 50 // Maximum number of leap second corrections - -struct QTzHeader { - char tzh_magic[4]; // TZ_MAGIC - char tzh_version; // '\0' or '2' as of 2005 - char tzh_reserved[15]; // reserved--must be zero - quint32 tzh_ttisgmtcnt; // number of trans. time flags - quint32 tzh_ttisstdcnt; // number of trans. time flags - quint32 tzh_leapcnt; // number of leap seconds - quint32 tzh_timecnt; // number of transition times - quint32 tzh_typecnt; // number of local time types - quint32 tzh_charcnt; // number of abbr. chars -}; - -struct QTzTransition { - qint64 tz_time; // Transition time - quint8 tz_typeind; // Type Index -}; -Q_DECLARE_TYPEINFO(QTzTransition, Q_PRIMITIVE_TYPE); - -struct QTzType { - int tz_gmtoff; // UTC offset in seconds - bool tz_isdst; // Is DST - quint8 tz_abbrind; // abbreviation list index -}; -Q_DECLARE_TYPEINFO(QTzType, Q_PRIMITIVE_TYPE); - - -// TZ File parsing - -static QTzHeader parseTzHeader(QDataStream &ds, bool *ok) -{ - QTzHeader hdr; - quint8 ch; - *ok = false; - - // Parse Magic, 4 bytes - ds.readRawData(hdr.tzh_magic, 4); - - if (memcmp(hdr.tzh_magic, TZ_MAGIC, 4) != 0 || ds.status() != QDataStream::Ok) - return hdr; - - // Parse Version, 1 byte, before 2005 was '\0', since 2005 a '2', since 2013 a '3' - ds >> ch; - hdr.tzh_version = ch; - if (ds.status() != QDataStream::Ok - || (hdr.tzh_version != '2' && hdr.tzh_version != '\0' && hdr.tzh_version != '3')) { - return hdr; - } - - // Parse reserved space, 15 bytes - ds.readRawData(hdr.tzh_reserved, 15); - if (ds.status() != QDataStream::Ok) - return hdr; - - // Parse rest of header, 6 x 4-byte transition counts - ds >> hdr.tzh_ttisgmtcnt >> hdr.tzh_ttisstdcnt >> hdr.tzh_leapcnt >> hdr.tzh_timecnt - >> hdr.tzh_typecnt >> hdr.tzh_charcnt; - - // Check defined maximums - if (ds.status() != QDataStream::Ok - || hdr.tzh_timecnt > TZ_MAX_TIMES - || hdr.tzh_typecnt > TZ_MAX_TYPES - || hdr.tzh_charcnt > TZ_MAX_CHARS - || hdr.tzh_leapcnt > TZ_MAX_LEAPS - || hdr.tzh_ttisgmtcnt > hdr.tzh_typecnt - || hdr.tzh_ttisstdcnt > hdr.tzh_typecnt) { - return hdr; - } - - *ok = true; - return hdr; -} - -static QVector parseTzTransitions(QDataStream &ds, int tzh_timecnt, bool longTran) -{ - QVector transitions(tzh_timecnt); - - if (longTran) { - // Parse tzh_timecnt x 8-byte transition times - for (int i = 0; i < tzh_timecnt && ds.status() == QDataStream::Ok; ++i) { - ds >> transitions[i].tz_time; - if (ds.status() != QDataStream::Ok) - transitions.resize(i); - } - } else { - // Parse tzh_timecnt x 4-byte transition times - qint32 val; - for (int i = 0; i < tzh_timecnt && ds.status() == QDataStream::Ok; ++i) { - ds >> val; - transitions[i].tz_time = val; - if (ds.status() != QDataStream::Ok) - transitions.resize(i); - } - } - - // Parse tzh_timecnt x 1-byte transition type index - for (int i = 0; i < tzh_timecnt && ds.status() == QDataStream::Ok; ++i) { - quint8 typeind; - ds >> typeind; - if (ds.status() == QDataStream::Ok) - transitions[i].tz_typeind = typeind; - } - - return transitions; -} - -static QVector parseTzTypes(QDataStream &ds, int tzh_typecnt) -{ - QVector types(tzh_typecnt); - - // Parse tzh_typecnt x transition types - for (int i = 0; i < tzh_typecnt && ds.status() == QDataStream::Ok; ++i) { - QTzType &type = types[i]; - // Parse UTC Offset, 4 bytes - ds >> type.tz_gmtoff; - // Parse Is DST flag, 1 byte - if (ds.status() == QDataStream::Ok) - ds >> type.tz_isdst; - // Parse Abbreviation Array Index, 1 byte - if (ds.status() == QDataStream::Ok) - ds >> type.tz_abbrind; - if (ds.status() != QDataStream::Ok) - types.resize(i); - } - - return types; -} - -static QMap parseTzAbbreviations(QDataStream &ds, int tzh_charcnt, const QVector &types) -{ - // Parse the abbreviation list which is tzh_charcnt long with '\0' separated strings. The - // QTzType.tz_abbrind index points to the first char of the abbreviation in the array, not the - // occurrence in the list. It can also point to a partial string so we need to use the actual typeList - // index values when parsing. By using a map with tz_abbrind as ordered key we get both index - // methods in one data structure and can convert the types afterwards. - QMap map; - quint8 ch; - QByteArray input; - // First parse the full abbrev string - for (int i = 0; i < tzh_charcnt && ds.status() == QDataStream::Ok; ++i) { - ds >> ch; - if (ds.status() == QDataStream::Ok) - input.append(char(ch)); - else - return map; - } - // Then extract all the substrings pointed to by types - for (const QTzType &type : types) { - QByteArray abbrev; - for (int i = type.tz_abbrind; input.at(i) != '\0'; ++i) - abbrev.append(input.at(i)); - // Have reached end of an abbreviation, so add to map - map[type.tz_abbrind] = abbrev; - } - return map; -} - -static void parseTzLeapSeconds(QDataStream &ds, int tzh_leapcnt, bool longTran) -{ - // Parse tzh_leapcnt x pairs of leap seconds - // We don't use leap seconds, so only read and don't store - qint32 val; - if (longTran) { - // v2 file format, each entry is 12 bytes long - qint64 time; - for (int i = 0; i < tzh_leapcnt && ds.status() == QDataStream::Ok; ++i) { - // Parse Leap Occurrence Time, 8 bytes - ds >> time; - // Parse Leap Seconds To Apply, 4 bytes - if (ds.status() == QDataStream::Ok) - ds >> val; - } - } else { - // v0 file format, each entry is 8 bytes long - for (int i = 0; i < tzh_leapcnt && ds.status() == QDataStream::Ok; ++i) { - // Parse Leap Occurrence Time, 4 bytes - ds >> val; - // Parse Leap Seconds To Apply, 4 bytes - if (ds.status() == QDataStream::Ok) - ds >> val; - } - } -} - -static QVector parseTzIndicators(QDataStream &ds, const QVector &types, int tzh_ttisstdcnt, int tzh_ttisgmtcnt) -{ - QVector result = types; - bool temp; - /* - Scan and discard indicators. - - These indicators are only of use (by the date program) when "handling - POSIX-style time zone environment variables". The flags here say whether - the *specification* of the zone gave the time in UTC, local standard time - or local wall time; but whatever was specified has been digested for us, - already, by the zone-info compiler (zic), so that the tz_time values read - from the file (by parseTzTransitions) are all in UTC. - */ - - // Scan tzh_ttisstdcnt x 1-byte standard/wall indicators - for (int i = 0; i < tzh_ttisstdcnt && ds.status() == QDataStream::Ok; ++i) - ds >> temp; - - // Scan tzh_ttisgmtcnt x 1-byte UTC/local indicators - for (int i = 0; i < tzh_ttisgmtcnt && ds.status() == QDataStream::Ok; ++i) - ds >> temp; - - return result; -} - -static QByteArray parseTzPosixRule(QDataStream &ds) -{ - // Parse POSIX rule, variable length '\n' enclosed - QByteArray rule; - - quint8 ch; - ds >> ch; - if (ch != '\n' || ds.status() != QDataStream::Ok) - return rule; - ds >> ch; - while (ch != '\n' && ds.status() == QDataStream::Ok) { - rule.append((char)ch); - ds >> ch; - } - - return rule; -} - -static QDate calculateDowDate(int year, int month, int dayOfWeek, int week) -{ - QDate date(year, month, 1); - int startDow = date.dayOfWeek(); - if (startDow <= dayOfWeek) - date = date.addDays(dayOfWeek - startDow - 7); - else - date = date.addDays(dayOfWeek - startDow); - date = date.addDays(week * 7); - while (date.month() != month) - date = date.addDays(-7); - return date; -} - -static QDate calculatePosixDate(const QByteArray &dateRule, int year) -{ - // Can start with M, J, or a digit - if (dateRule.at(0) == 'M') { - // nth week in month format "Mmonth.week.dow" - QList dateParts = dateRule.split('.'); - int month = dateParts.at(0).mid(1).toInt(); - int week = dateParts.at(1).toInt(); - int dow = dateParts.at(2).toInt(); - if (dow == 0) - ++dow; - return calculateDowDate(year, month, dow, week); - } else if (dateRule.at(0) == 'J') { - // Day of Year ignores Feb 29 - int doy = dateRule.mid(1).toInt(); - QDate date = QDate(year, 1, 1).addDays(doy - 1); - if (QDate::isLeapYear(date.year())) - date = date.addDays(-1); - return date; - } else { - // Day of Year includes Feb 29 - int doy = dateRule.toInt(); - return QDate(year, 1, 1).addDays(doy - 1); - } -} - -// returns the time in seconds, INT_MIN if we failed to parse -static int parsePosixTime(const char *begin, const char *end) -{ - // Format "hh[:mm[:ss]]" - int hour, min = 0, sec = 0; - - // Note that the calls to qstrtoll do *not* check the end pointer, which - // means they proceed until they find a non-digit. We check that we're - // still in range at the end, but we may have read from past end. It's the - // caller's responsibility to ensure that begin is part of a - // null-terminated string. - - bool ok = false; - hour = qstrtoll(begin, &begin, 10, &ok); - if (!ok || hour < 0) - return INT_MIN; - if (begin < end && *begin == ':') { - // minutes - ++begin; - min = qstrtoll(begin, &begin, 10, &ok); - if (!ok || min < 0) - return INT_MIN; - - if (begin < end && *begin == ':') { - // seconds - ++begin; - sec = qstrtoll(begin, &begin, 10, &ok); - if (!ok || sec < 0) - return INT_MIN; - } - } - - // we must have consumed everything - if (begin != end) - return INT_MIN; - - return (hour * 60 + min) * 60 + sec; -} - -static QTime parsePosixTransitionTime(const QByteArray &timeRule) -{ - // Format "hh[:mm[:ss]]" - int value = parsePosixTime(timeRule.constBegin(), timeRule.constEnd()); - if (value == INT_MIN) { - // if we failed to parse, return 02:00 - return QTime(2, 0, 0); - } - return QTime::fromMSecsSinceStartOfDay(value * 1000); -} - -static int parsePosixOffset(const char *begin, const char *end) -{ - // Format "[+|-]hh[:mm[:ss]]" - // note that the sign is inverted because POSIX counts in hours West of GMT - bool negate = true; - if (*begin == '+') { - ++begin; - } else if (*begin == '-') { - negate = false; - ++begin; - } - - int value = parsePosixTime(begin, end); - if (value == INT_MIN) - return value; - return negate ? -value : value; -} - -static inline bool asciiIsLetter(char ch) -{ - ch |= 0x20; // lowercases if it is a letter, otherwise just corrupts ch - return ch >= 'a' && ch <= 'z'; -} - -namespace { - -struct PosixZone -{ - enum { - InvalidOffset = INT_MIN, - }; - - QString name; - int offset; - - static PosixZone invalid() { return {QString(), InvalidOffset}; } - static PosixZone parse(const char *&pos, const char *end); - - bool hasValidOffset() const noexcept { return offset != InvalidOffset; } -}; - -} // unnamed namespace - -// Returns the zone name, the offset (in seconds) and advances \a begin to -// where the parsing ended. Returns a zone of INT_MIN in case an offset -// couldn't be read. -PosixZone PosixZone::parse(const char *&pos, const char *end) -{ - static const char offsetChars[] = "0123456789:"; - - const char *nameBegin = pos; - const char *nameEnd; - Q_ASSERT(pos < end); - - if (*pos == '<') { - nameBegin = pos + 1; // skip the '<' - nameEnd = nameBegin; - while (nameEnd < end && *nameEnd != '>') { - // POSIX says only alphanumeric, but we allow anything - ++nameEnd; - } - pos = nameEnd + 1; // skip the '>' - } else { - nameBegin = pos; - nameEnd = nameBegin; - while (nameEnd < end && asciiIsLetter(*nameEnd)) - ++nameEnd; - pos = nameEnd; - } - if (nameEnd - nameBegin < 3) - return invalid(); // name must be at least 3 characters long - - // zone offset, form [+-]hh:mm:ss - const char *zoneBegin = pos; - const char *zoneEnd = pos; - if (zoneEnd < end && (zoneEnd[0] == '+' || zoneEnd[0] == '-')) - ++zoneEnd; - while (zoneEnd < end) { - if (strchr(offsetChars, char(*zoneEnd)) == NULL) - break; - ++zoneEnd; - } - - QString name = QString::fromUtf8(nameBegin, nameEnd - nameBegin); - const int offset = zoneEnd > zoneBegin ? parsePosixOffset(zoneBegin, zoneEnd) : InvalidOffset; - pos = zoneEnd; - // UTC+hh:mm:ss or GMT+hh:mm:ss should be read as offsets from UTC, not as a - // POSIX rule naming a zone as UTC or GMT and specifying a non-zero offset. - if (offset != 0 && (name == QLatin1String("UTC") || name == QLatin1String("GMT"))) - return invalid(); - return {std::move(name), offset}; -} - -static QVector calculatePosixTransitions(const QByteArray &posixRule, - int startYear, int endYear, - qint64 lastTranMSecs) -{ - QVector result; - - // POSIX Format is like "TZ=CST6CDT,M3.2.0/2:00:00,M11.1.0/2:00:00" - // i.e. "std offset dst [offset],start[/time],end[/time]" - // See the section about TZ at - // http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html - QList parts = posixRule.split(','); - - PosixZone stdZone, dstZone = PosixZone::invalid(); - { - const QByteArray &zoneinfo = parts.at(0); - const char *begin = zoneinfo.constBegin(); - - stdZone = PosixZone::parse(begin, zoneinfo.constEnd()); - if (!stdZone.hasValidOffset()) { - stdZone.offset = 0; // reset to UTC if we failed to parse - } else if (begin < zoneinfo.constEnd()) { - dstZone = PosixZone::parse(begin, zoneinfo.constEnd()); - if (!dstZone.hasValidOffset()) { - // if the dst offset isn't provided, it is 1 hour ahead of the standard offset - dstZone.offset = stdZone.offset + (60 * 60); - } - } - } - - // If only the name part then no transitions - if (parts.count() == 1) { - QTimeZonePrivate::Data data; - data.atMSecsSinceEpoch = lastTranMSecs; - data.offsetFromUtc = stdZone.offset; - data.standardTimeOffset = stdZone.offset; - data.daylightTimeOffset = 0; - data.abbreviation = stdZone.name; - result << data; - return result; - } - - - // Get the std to dst transtion details - QList dstParts = parts.at(1).split('/'); - QByteArray dstDateRule = dstParts.at(0); - QTime dstTime; - if (dstParts.count() > 1) - dstTime = parsePosixTransitionTime(dstParts.at(1)); - else - dstTime = QTime(2, 0, 0); - - // Get the dst to std transtion details - QList stdParts = parts.at(2).split('/'); - QByteArray stdDateRule = stdParts.at(0); - QTime stdTime; - if (stdParts.count() > 1) - stdTime = parsePosixTransitionTime(stdParts.at(1)); - else - stdTime = QTime(2, 0, 0); - - // Limit year to the range QDateTime can represent: - const int minYear = int(QDateTimePrivate::YearRange::First); - const int maxYear = int(QDateTimePrivate::YearRange::Last); - startYear = qBound(minYear, startYear, maxYear); - endYear = qBound(minYear, endYear, maxYear); - Q_ASSERT(startYear <= endYear); - - for (int year = startYear; year <= endYear; ++year) { - QTimeZonePrivate::Data dstData; - QDateTime dst(calculatePosixDate(dstDateRule, year), dstTime, Qt::UTC); - dstData.atMSecsSinceEpoch = dst.toMSecsSinceEpoch() - (stdZone.offset * 1000); - dstData.offsetFromUtc = dstZone.offset; - dstData.standardTimeOffset = stdZone.offset; - dstData.daylightTimeOffset = dstZone.offset - stdZone.offset; - dstData.abbreviation = dstZone.name; - QTimeZonePrivate::Data stdData; - QDateTime std(calculatePosixDate(stdDateRule, year), stdTime, Qt::UTC); - stdData.atMSecsSinceEpoch = std.toMSecsSinceEpoch() - (dstZone.offset * 1000); - stdData.offsetFromUtc = stdZone.offset; - stdData.standardTimeOffset = stdZone.offset; - stdData.daylightTimeOffset = 0; - stdData.abbreviation = stdZone.name; - // Part of maxYear will overflow (likewise for minYear, below): - if (year == maxYear && (dstData.atMSecsSinceEpoch < 0 || stdData.atMSecsSinceEpoch < 0)) { - if (dstData.atMSecsSinceEpoch > 0) { - result << dstData; - } else if (stdData.atMSecsSinceEpoch > 0) { - result << stdData; - } - } else if (year < 1970) { // We ignore DST before the epoch. - if (year > minYear || stdData.atMSecsSinceEpoch != QTimeZonePrivate::invalidMSecs()) - result << stdData; - } else if (dst < std) { - result << dstData << stdData; - } else { - result << stdData << dstData; - } - } - return result; -} - -// Create the system default time zone -QTzTimeZonePrivate::QTzTimeZonePrivate() -{ - init(systemTimeZoneId()); -} - -// Create a named time zone -QTzTimeZonePrivate::QTzTimeZonePrivate(const QByteArray &ianaId) -{ - init(ianaId); -} - -QTzTimeZonePrivate::~QTzTimeZonePrivate() -{ -} - -QTzTimeZonePrivate *QTzTimeZonePrivate::clone() const -{ - return new QTzTimeZonePrivate(*this); -} - -void QTzTimeZonePrivate::init(const QByteArray &ianaId) -{ - QFile tzif; - if (ianaId.isEmpty()) { - // Open system tz - tzif.setFileName(QStringLiteral("/etc/localtime")); - if (!tzif.open(QIODevice::ReadOnly)) - return; - } else { - // Open named tz, try modern path first, if fails try legacy path - tzif.setFileName(QLatin1String("/usr/share/zoneinfo/") + QString::fromLocal8Bit(ianaId)); - if (!tzif.open(QIODevice::ReadOnly)) { - tzif.setFileName(QLatin1String("/usr/lib/zoneinfo/") + QString::fromLocal8Bit(ianaId)); - if (!tzif.open(QIODevice::ReadOnly)) { - // ianaId may be a POSIX rule, taken from $TZ or /etc/TZ - const QByteArray zoneInfo = ianaId.split(',').at(0); - const char *begin = zoneInfo.constBegin(); - if (PosixZone::parse(begin, zoneInfo.constEnd()).hasValidOffset() - && (begin == zoneInfo.constEnd() - || PosixZone::parse(begin, zoneInfo.constEnd()).hasValidOffset())) { - m_id = m_posixRule = ianaId; - } - return; - } - } - } - - QDataStream ds(&tzif); - - // Parse the old version block of data - bool ok = false; - QTzHeader hdr = parseTzHeader(ds, &ok); - if (!ok || ds.status() != QDataStream::Ok) - return; - QVector tranList = parseTzTransitions(ds, hdr.tzh_timecnt, false); - if (ds.status() != QDataStream::Ok) - return; - QVector typeList = parseTzTypes(ds, hdr.tzh_typecnt); - if (ds.status() != QDataStream::Ok) - return; - QMap abbrevMap = parseTzAbbreviations(ds, hdr.tzh_charcnt, typeList); - if (ds.status() != QDataStream::Ok) - return; - parseTzLeapSeconds(ds, hdr.tzh_leapcnt, false); - if (ds.status() != QDataStream::Ok) - return; - typeList = parseTzIndicators(ds, typeList, hdr.tzh_ttisstdcnt, hdr.tzh_ttisgmtcnt); - if (ds.status() != QDataStream::Ok) - return; - - // If version 2 then parse the second block of data - if (hdr.tzh_version == '2' || hdr.tzh_version == '3') { - ok = false; - QTzHeader hdr2 = parseTzHeader(ds, &ok); - if (!ok || ds.status() != QDataStream::Ok) - return; - tranList = parseTzTransitions(ds, hdr2.tzh_timecnt, true); - if (ds.status() != QDataStream::Ok) - return; - typeList = parseTzTypes(ds, hdr2.tzh_typecnt); - if (ds.status() != QDataStream::Ok) - return; - abbrevMap = parseTzAbbreviations(ds, hdr2.tzh_charcnt, typeList); - if (ds.status() != QDataStream::Ok) - return; - parseTzLeapSeconds(ds, hdr2.tzh_leapcnt, true); - if (ds.status() != QDataStream::Ok) - return; - typeList = parseTzIndicators(ds, typeList, hdr2.tzh_ttisstdcnt, hdr2.tzh_ttisgmtcnt); - if (ds.status() != QDataStream::Ok) - return; - m_posixRule = parseTzPosixRule(ds); - if (ds.status() != QDataStream::Ok) - return; - } - - // Translate the TZ file into internal format - - // Translate the array index based tz_abbrind into list index - const int size = abbrevMap.size(); - m_abbreviations.clear(); - m_abbreviations.reserve(size); - QVector abbrindList; - abbrindList.reserve(size); - for (auto it = abbrevMap.cbegin(), end = abbrevMap.cend(); it != end; ++it) { - m_abbreviations.append(it.value()); - abbrindList.append(it.key()); - } - for (int i = 0; i < typeList.size(); ++i) - typeList[i].tz_abbrind = abbrindList.indexOf(typeList.at(i).tz_abbrind); - - // Offsets are stored as total offset, want to know separate UTC and DST offsets - // so find the first non-dst transition to use as base UTC Offset - int utcOffset = 0; - for (const QTzTransition &tran : qAsConst(tranList)) { - if (!typeList.at(tran.tz_typeind).tz_isdst) { - utcOffset = typeList.at(tran.tz_typeind).tz_gmtoff; - break; - } - } - - // Now for each transition time calculate and store our rule: - const int tranCount = tranList.count();; - m_tranTimes.reserve(tranCount); - // The DST offset when in effect: usually stable, usually an hour: - int lastDstOff = 3600; - for (int i = 0; i < tranCount; i++) { - const QTzTransition &tz_tran = tranList.at(i); - QTzTransitionTime tran; - QTzTransitionRule rule; - const QTzType tz_type = typeList.at(tz_tran.tz_typeind); - - // Calculate the associated Rule - if (!tz_type.tz_isdst) { - utcOffset = tz_type.tz_gmtoff; - } else if (Q_UNLIKELY(tz_type.tz_gmtoff != utcOffset + lastDstOff)) { - /* - This might be a genuine change in DST offset, but could also be - DST starting at the same time as the standard offset changed. See - if DST's end gives a more plausible utcOffset (i.e. one closer to - the last we saw, or a simple whole hour): - */ - // Standard offset inferred from net offset and expected DST offset: - const int inferStd = tz_type.tz_gmtoff - lastDstOff; // != utcOffset - for (int j = i + 1; j < tranCount; j++) { - const QTzType new_type = typeList.at(tranList.at(j).tz_typeind); - if (!new_type.tz_isdst) { - const int newUtc = new_type.tz_gmtoff; - if (newUtc == utcOffset) { - // DST-end can't help us, avoid lots of messy checks. - // else: See if the end matches the familiar DST offset: - } else if (newUtc == inferStd) { - utcOffset = newUtc; - // else: let either end shift us to one hour as DST offset: - } else if (tz_type.tz_gmtoff - 3600 == utcOffset) { - // Start does it - } else if (tz_type.tz_gmtoff - 3600 == newUtc) { - utcOffset = newUtc; // End does it - // else: prefer whichever end gives DST offset closer to - // last, but consider any offset > 0 "closer" than any <= 0: - } else if (newUtc < tz_type.tz_gmtoff - ? (utcOffset >= tz_type.tz_gmtoff - || qAbs(newUtc - inferStd) < qAbs(utcOffset - inferStd)) - : (utcOffset >= tz_type.tz_gmtoff - && qAbs(newUtc - inferStd) < qAbs(utcOffset - inferStd))) { - utcOffset = newUtc; - } - break; - } - } - lastDstOff = tz_type.tz_gmtoff - utcOffset; - } - rule.stdOffset = utcOffset; - rule.dstOffset = tz_type.tz_gmtoff - utcOffset; - rule.abbreviationIndex = tz_type.tz_abbrind; - - // If the rule already exist then use that, otherwise add it - int ruleIndex = m_tranRules.indexOf(rule); - if (ruleIndex == -1) { - m_tranRules.append(rule); - tran.ruleIndex = m_tranRules.size() - 1; - } else { - tran.ruleIndex = ruleIndex; - } - - tran.atMSecsSinceEpoch = tz_tran.tz_time * 1000; - m_tranTimes.append(tran); - } - if (m_tranTimes.isEmpty() && m_posixRule.isEmpty()) - return; // Invalid after all ! - - if (ianaId.isEmpty()) - m_id = systemTimeZoneId(); - else - m_id = ianaId; -} - -QLocale::Country QTzTimeZonePrivate::country() const -{ - return tzZones->value(m_id).country; -} - -QString QTzTimeZonePrivate::comment() const -{ - return QString::fromUtf8(tzZones->value(m_id).comment); -} - -QString QTzTimeZonePrivate::displayName(qint64 atMSecsSinceEpoch, - QTimeZone::NameType nameType, - const QLocale &locale) const -{ -#if QT_CONFIG(icu) - if (!m_icu) - m_icu = new QIcuTimeZonePrivate(m_id); - // TODO small risk may not match if tran times differ due to outdated files - // TODO Some valid TZ names are not valid ICU names, use translation table? - if (m_icu->isValid()) - return m_icu->displayName(atMSecsSinceEpoch, nameType, locale); -#else - Q_UNUSED(nameType) - Q_UNUSED(locale) -#endif - return abbreviation(atMSecsSinceEpoch); -} - -QString QTzTimeZonePrivate::displayName(QTimeZone::TimeType timeType, - QTimeZone::NameType nameType, - const QLocale &locale) const -{ -#if QT_CONFIG(icu) - if (!m_icu) - m_icu = new QIcuTimeZonePrivate(m_id); - // TODO small risk may not match if tran times differ due to outdated files - // TODO Some valid TZ names are not valid ICU names, use translation table? - if (m_icu->isValid()) - return m_icu->displayName(timeType, nameType, locale); -#else - Q_UNUSED(timeType) - Q_UNUSED(nameType) - Q_UNUSED(locale) -#endif - // If no ICU available then have to use abbreviations instead - // Abbreviations don't have GenericTime - if (timeType == QTimeZone::GenericTime) - timeType = QTimeZone::StandardTime; - - // Get current tran, if valid and is what we want, then use it - const qint64 currentMSecs = QDateTime::currentMSecsSinceEpoch(); - QTimeZonePrivate::Data tran = data(currentMSecs); - if (tran.atMSecsSinceEpoch != invalidMSecs() - && ((timeType == QTimeZone::DaylightTime && tran.daylightTimeOffset != 0) - || (timeType == QTimeZone::StandardTime && tran.daylightTimeOffset == 0))) { - return tran.abbreviation; - } - - // Otherwise get next tran and if valid and is what we want, then use it - tran = nextTransition(currentMSecs); - if (tran.atMSecsSinceEpoch != invalidMSecs() - && ((timeType == QTimeZone::DaylightTime && tran.daylightTimeOffset != 0) - || (timeType == QTimeZone::StandardTime && tran.daylightTimeOffset == 0))) { - return tran.abbreviation; - } - - // Otherwise get prev tran and if valid and is what we want, then use it - tran = previousTransition(currentMSecs); - if (tran.atMSecsSinceEpoch != invalidMSecs()) - tran = previousTransition(tran.atMSecsSinceEpoch); - if (tran.atMSecsSinceEpoch != invalidMSecs() - && ((timeType == QTimeZone::DaylightTime && tran.daylightTimeOffset != 0) - || (timeType == QTimeZone::StandardTime && tran.daylightTimeOffset == 0))) { - return tran.abbreviation; - } - - // Otherwise is strange sequence, so work backwards through trans looking for first match, if any - auto it = std::partition_point(m_tranTimes.cbegin(), m_tranTimes.cend(), - [currentMSecs](const QTzTransitionTime &at) { - return at.atMSecsSinceEpoch <= currentMSecs; - }); - - while (it != m_tranTimes.cbegin()) { - --it; - tran = dataForTzTransition(*it); - int offset = tran.daylightTimeOffset; - if ((timeType == QTimeZone::DaylightTime) != (offset == 0)) - return tran.abbreviation; - } - - // Otherwise if no match use current data - return data(currentMSecs).abbreviation; -} - -QString QTzTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const -{ - return data(atMSecsSinceEpoch).abbreviation; -} - -int QTzTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const -{ - const QTimeZonePrivate::Data tran = data(atMSecsSinceEpoch); - return tran.offsetFromUtc; // == tran.standardTimeOffset + tran.daylightTimeOffset -} - -int QTzTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const -{ - return data(atMSecsSinceEpoch).standardTimeOffset; -} - -int QTzTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const -{ - return data(atMSecsSinceEpoch).daylightTimeOffset; -} - -bool QTzTimeZonePrivate::hasDaylightTime() const -{ - // TODO Perhaps cache as frequently accessed? - for (const QTzTransitionRule &rule : m_tranRules) { - if (rule.dstOffset != 0) - return true; - } - return false; -} - -bool QTzTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const -{ - return (daylightTimeOffset(atMSecsSinceEpoch) != 0); -} - -QTimeZonePrivate::Data QTzTimeZonePrivate::dataForTzTransition(QTzTransitionTime tran) const -{ - QTimeZonePrivate::Data data; - data.atMSecsSinceEpoch = tran.atMSecsSinceEpoch; - QTzTransitionRule rule = m_tranRules.at(tran.ruleIndex); - data.standardTimeOffset = rule.stdOffset; - data.daylightTimeOffset = rule.dstOffset; - data.offsetFromUtc = rule.stdOffset + rule.dstOffset; - data.abbreviation = QString::fromUtf8(m_abbreviations.at(rule.abbreviationIndex)); - return data; -} - -QVector QTzTimeZonePrivate::getPosixTransitions(qint64 msNear) const -{ - const int year = QDateTime::fromMSecsSinceEpoch(msNear, Qt::UTC).date().year(); - // The Data::atMSecsSinceEpoch of the single entry if zone is constant: - qint64 atTime = m_tranTimes.isEmpty() ? msNear : m_tranTimes.last().atMSecsSinceEpoch; - return calculatePosixTransitions(m_posixRule, year - 1, year + 1, atTime); -} - -QTimeZonePrivate::Data QTzTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const -{ - // If the required time is after the last transition (or there were none) - // and we have a POSIX rule, then use it: - if (!m_posixRule.isEmpty() - && (m_tranTimes.isEmpty() || m_tranTimes.last().atMSecsSinceEpoch < forMSecsSinceEpoch)) { - QVector posixTrans = getPosixTransitions(forMSecsSinceEpoch); - auto it = std::partition_point(posixTrans.cbegin(), posixTrans.cend(), - [forMSecsSinceEpoch] (const QTimeZonePrivate::Data &at) { - return at.atMSecsSinceEpoch <= forMSecsSinceEpoch; - }); - // Use most recent, if any in the past; or the first if we have no other rules: - if (it > posixTrans.cbegin() || (m_tranTimes.isEmpty() && it < posixTrans.cend())) { - QTimeZonePrivate::Data data = *(it > posixTrans.cbegin() ? it - 1 : it); - data.atMSecsSinceEpoch = forMSecsSinceEpoch; - return data; - } - } - if (m_tranTimes.isEmpty()) // Only possible if !isValid() - return invalidData(); - - // Otherwise, use the rule for the most recent or first transition: - auto last = std::partition_point(m_tranTimes.cbegin(), m_tranTimes.cend(), - [forMSecsSinceEpoch] (const QTzTransitionTime &at) { - return at.atMSecsSinceEpoch <= forMSecsSinceEpoch; - }); - if (last > m_tranTimes.cbegin()) - --last; - Data data = dataForTzTransition(*last); - data.atMSecsSinceEpoch = forMSecsSinceEpoch; - return data; -} - -bool QTzTimeZonePrivate::hasTransitions() const -{ - return true; -} - -QTimeZonePrivate::Data QTzTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const -{ - // If the required time is after the last transition (or there were none) - // and we have a POSIX rule, then use it: - if (!m_posixRule.isEmpty() - && (m_tranTimes.isEmpty() || m_tranTimes.last().atMSecsSinceEpoch < afterMSecsSinceEpoch)) { - QVector posixTrans = getPosixTransitions(afterMSecsSinceEpoch); - auto it = std::partition_point(posixTrans.cbegin(), posixTrans.cend(), - [afterMSecsSinceEpoch] (const QTimeZonePrivate::Data &at) { - return at.atMSecsSinceEpoch <= afterMSecsSinceEpoch; - }); - - return it == posixTrans.cend() ? invalidData() : *it; - } - - // Otherwise, if we can find a valid tran, use its rule: - auto last = std::partition_point(m_tranTimes.cbegin(), m_tranTimes.cend(), - [afterMSecsSinceEpoch] (const QTzTransitionTime &at) { - return at.atMSecsSinceEpoch <= afterMSecsSinceEpoch; - }); - return last != m_tranTimes.cend() ? dataForTzTransition(*last) : invalidData(); -} - -QTimeZonePrivate::Data QTzTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const -{ - // If the required time is after the last transition (or there were none) - // and we have a POSIX rule, then use it: - if (!m_posixRule.isEmpty() - && (m_tranTimes.isEmpty() || m_tranTimes.last().atMSecsSinceEpoch < beforeMSecsSinceEpoch)) { - QVector posixTrans = getPosixTransitions(beforeMSecsSinceEpoch); - auto it = std::partition_point(posixTrans.cbegin(), posixTrans.cend(), - [beforeMSecsSinceEpoch] (const QTimeZonePrivate::Data &at) { - return at.atMSecsSinceEpoch < beforeMSecsSinceEpoch; - }); - if (it > posixTrans.cbegin()) - return *--it; - // It fell between the last transition (if any) and the first of the POSIX rule: - return m_tranTimes.isEmpty() ? invalidData() : dataForTzTransition(m_tranTimes.last()); - } - - // Otherwise if we can find a valid tran then use its rule - auto last = std::partition_point(m_tranTimes.cbegin(), m_tranTimes.cend(), - [beforeMSecsSinceEpoch] (const QTzTransitionTime &at) { - return at.atMSecsSinceEpoch < beforeMSecsSinceEpoch; - }); - return last > m_tranTimes.cbegin() ? dataForTzTransition(*--last) : invalidData(); -} - -// TODO Could cache the value and monitor the required files for any changes -QByteArray QTzTimeZonePrivate::systemTimeZoneId() const -{ - // Check TZ env var first, if not populated try find it - QByteArray ianaId = qgetenv("TZ"); - if (!ianaId.isEmpty() && ianaId.at(0) == ':') - ianaId = ianaId.mid(1); - - // The TZ value can be ":/etc/localtime" which libc considers - // to be a "default timezone", in which case it will be read - // by one of the blocks below, so unset it here so it is not - // considered as a valid/found ianaId - if (ianaId == "/etc/localtime") - ianaId.clear(); - - // On most distros /etc/localtime is a symlink to a real file so extract name from the path - if (ianaId.isEmpty()) { - const QString path = QFile::symLinkTarget(QStringLiteral("/etc/localtime")); - if (!path.isEmpty()) { - // /etc/localtime is a symlink to the current TZ file, so extract from path - int index = path.indexOf(QLatin1String("/zoneinfo/")); - if (index != -1) - ianaId = path.mid(index + 10).toUtf8(); - } - } - - // On Debian Etch up to Jessie, /etc/localtime is a regular file while the actual name is in /etc/timezone - if (ianaId.isEmpty()) { - QFile tzif(QStringLiteral("/etc/timezone")); - if (tzif.open(QIODevice::ReadOnly)) { - // TODO QTextStream inefficient, replace later - QTextStream ts(&tzif); - if (!ts.atEnd()) - ianaId = ts.readLine().toUtf8(); - } - } - - // On some Red Hat distros /etc/localtime is real file with name held in /etc/sysconfig/clock - // in a line like ZONE="Europe/Oslo" or TIMEZONE="Europe/Oslo" - if (ianaId.isEmpty()) { - QFile tzif(QStringLiteral("/etc/sysconfig/clock")); - if (tzif.open(QIODevice::ReadOnly)) { - // TODO QTextStream inefficient, replace later - QTextStream ts(&tzif); - QString line; - while (ianaId.isEmpty() && !ts.atEnd() && ts.status() == QTextStream::Ok) { - line = ts.readLine(); - if (line.startsWith(QLatin1String("ZONE="))) { - ianaId = line.mid(6, line.size() - 7).toUtf8(); - } else if (line.startsWith(QLatin1String("TIMEZONE="))) { - ianaId = line.mid(10, line.size() - 11).toUtf8(); - } - } - } - } - - // Some systems (e.g. uClibc) have a default value for $TZ in /etc/TZ: - if (ianaId.isEmpty()) { - QFile zone(QStringLiteral("/etc/TZ")); - if (zone.open(QIODevice::ReadOnly)) - ianaId = zone.readAll().trimmed(); - } - - // Give up for now and return UTC - if (ianaId.isEmpty()) - ianaId = utcQByteArray(); - - return ianaId; -} - -bool QTzTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const -{ - return tzZones->contains(ianaId); -} - -QList QTzTimeZonePrivate::availableTimeZoneIds() const -{ - QList result = tzZones->keys(); - std::sort(result.begin(), result.end()); - return result; -} - -QList QTzTimeZonePrivate::availableTimeZoneIds(QLocale::Country country) const -{ - // TODO AnyCountry - QList result; - for (auto it = tzZones->cbegin(), end = tzZones->cend(); it != end; ++it) { - if (it.value().country == country) - result << it.key(); - } - std::sort(result.begin(), result.end()); - return result; -} - -QT_END_NAMESPACE diff --git a/src/corelib/tools/qtimezoneprivate_win.cpp b/src/corelib/tools/qtimezoneprivate_win.cpp deleted file mode 100644 index 1bf2366748..0000000000 --- a/src/corelib/tools/qtimezoneprivate_win.cpp +++ /dev/null @@ -1,927 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 John Layt -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qtimezone.h" -#include "qtimezoneprivate_p.h" - -#include "qdatetime.h" - -#include "qdebug.h" - -#include - -QT_BEGIN_NAMESPACE - -#ifndef Q_OS_WINRT -// The registry-based timezone backend is not available on WinRT, which falls back to equivalent APIs. -#define QT_USE_REGISTRY_TIMEZONE 1 -#endif - -/* - Private - - Windows system implementation -*/ - -#define MAX_KEY_LENGTH 255 -#define FILETIME_UNIX_EPOCH Q_UINT64_C(116444736000000000) - -// MSDN home page for Time support -// http://msdn.microsoft.com/en-us/library/windows/desktop/ms724962%28v=vs.85%29.aspx - -// For Windows XP and later refer to MSDN docs on TIME_ZONE_INFORMATION structure -// http://msdn.microsoft.com/en-gb/library/windows/desktop/ms725481%28v=vs.85%29.aspx - -// Vista introduced support for historic data, see MSDN docs on DYNAMIC_TIME_ZONE_INFORMATION -// http://msdn.microsoft.com/en-gb/library/windows/desktop/ms724253%28v=vs.85%29.aspx -#ifdef QT_USE_REGISTRY_TIMEZONE -static const char tzRegPath[] = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones"; -static const char currTzRegPath[] = "SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation"; -#endif - -enum { - MIN_YEAR = -292275056, - MAX_YEAR = 292278994, - MSECS_PER_DAY = 86400000, - TIME_T_MAX = 2145916799, // int maximum 2037-12-31T23:59:59 UTC - JULIAN_DAY_FOR_EPOCH = 2440588 // result of julianDayFromDate(1970, 1, 1) -}; - -// Copied from MSDN, see above for link -typedef struct _REG_TZI_FORMAT -{ - LONG Bias; - LONG StandardBias; - LONG DaylightBias; - SYSTEMTIME StandardDate; - SYSTEMTIME DaylightDate; -} REG_TZI_FORMAT; - -namespace { - -// Fast and reliable conversion from msecs to date for all values -// Adapted from QDateTime msecsToDate -QDate msecsToDate(qint64 msecs) -{ - qint64 jd = JULIAN_DAY_FOR_EPOCH; - - if (qAbs(msecs) >= MSECS_PER_DAY) { - jd += (msecs / MSECS_PER_DAY); - msecs %= MSECS_PER_DAY; - } - - if (msecs < 0) { - qint64 ds = MSECS_PER_DAY - msecs - 1; - jd -= ds / MSECS_PER_DAY; - } - - return QDate::fromJulianDay(jd); -} - -bool equalSystemtime(const SYSTEMTIME &t1, const SYSTEMTIME &t2) -{ - return (t1.wYear == t2.wYear - && t1.wMonth == t2.wMonth - && t1.wDay == t2.wDay - && t1.wDayOfWeek == t2.wDayOfWeek - && t1.wHour == t2.wHour - && t1.wMinute == t2.wMinute - && t1.wSecond == t2.wSecond - && t1.wMilliseconds == t2.wMilliseconds); -} - -bool equalTzi(const TIME_ZONE_INFORMATION &tzi1, const TIME_ZONE_INFORMATION &tzi2) -{ - return(tzi1.Bias == tzi2.Bias - && tzi1.StandardBias == tzi2.StandardBias - && equalSystemtime(tzi1.StandardDate, tzi2.StandardDate) - && wcscmp(tzi1.StandardName, tzi2.StandardName) == 0 - && tzi1.DaylightBias == tzi2.DaylightBias - && equalSystemtime(tzi1.DaylightDate, tzi2.DaylightDate) - && wcscmp(tzi1.DaylightName, tzi2.DaylightName) == 0); -} - -#ifdef QT_USE_REGISTRY_TIMEZONE -bool openRegistryKey(const QString &keyPath, HKEY *key) -{ - return RegOpenKeyEx(HKEY_LOCAL_MACHINE, reinterpret_cast(keyPath.utf16()), - 0, KEY_READ, key) == ERROR_SUCCESS; -} - -QString readRegistryString(const HKEY &key, const wchar_t *value) -{ - wchar_t buffer[MAX_PATH] = {0}; - DWORD size = sizeof(wchar_t) * MAX_PATH; - RegQueryValueEx(key, value, nullptr, nullptr, reinterpret_cast(buffer), &size); - return QString::fromWCharArray(buffer); -} - -int readRegistryValue(const HKEY &key, const wchar_t *value) -{ - DWORD buffer; - DWORD size = sizeof(buffer); - RegQueryValueEx(key, value, nullptr, nullptr, reinterpret_cast(&buffer), &size); - return buffer; -} - -QWinTimeZonePrivate::QWinTransitionRule readRegistryRule(const HKEY &key, - const wchar_t *value, bool *ok) -{ - *ok = false; - QWinTimeZonePrivate::QWinTransitionRule rule; - REG_TZI_FORMAT tzi; - DWORD tziSize = sizeof(tzi); - if (RegQueryValueEx(key, value, nullptr, nullptr, reinterpret_cast(&tzi), &tziSize) - == ERROR_SUCCESS) { - rule.startYear = 0; - rule.standardTimeBias = tzi.Bias + tzi.StandardBias; - rule.daylightTimeBias = tzi.Bias + tzi.DaylightBias - rule.standardTimeBias; - rule.standardTimeRule = tzi.StandardDate; - rule.daylightTimeRule = tzi.DaylightDate; - *ok = true; - } - return rule; -} - -TIME_ZONE_INFORMATION getRegistryTzi(const QByteArray &windowsId, bool *ok) -{ - *ok = false; - TIME_ZONE_INFORMATION tzi; - REG_TZI_FORMAT regTzi; - DWORD regTziSize = sizeof(regTzi); - HKEY key = NULL; - const QString tziKeyPath = QString::fromUtf8(tzRegPath) + QLatin1Char('\\') - + QString::fromUtf8(windowsId); - - if (openRegistryKey(tziKeyPath, &key)) { - - DWORD size = sizeof(tzi.DaylightName); - RegQueryValueEx(key, L"Dlt", nullptr, nullptr, reinterpret_cast(tzi.DaylightName), &size); - - size = sizeof(tzi.StandardName); - RegQueryValueEx(key, L"Std", nullptr, nullptr, reinterpret_cast(tzi.StandardName), &size); - - if (RegQueryValueEx(key, L"TZI", nullptr, nullptr, reinterpret_cast(®Tzi), ®TziSize) - == ERROR_SUCCESS) { - tzi.Bias = regTzi.Bias; - tzi.StandardBias = regTzi.StandardBias; - tzi.DaylightBias = regTzi.DaylightBias; - tzi.StandardDate = regTzi.StandardDate; - tzi.DaylightDate = regTzi.DaylightDate; - *ok = true; - } - - RegCloseKey(key); - } - - return tzi; -} -#else // QT_USE_REGISTRY_TIMEZONE -struct QWinDynamicTimeZone -{ - QString standardName; - QString daylightName; - QString timezoneName; - qint32 bias; - bool daylightTime; -}; - -typedef QHash QWinRTTimeZoneHash; - -Q_GLOBAL_STATIC(QWinRTTimeZoneHash, gTimeZones) - -void enumerateTimeZones() -{ - DYNAMIC_TIME_ZONE_INFORMATION dtzInfo; - quint32 index = 0; - QString prevTimeZoneKeyName; - while (SUCCEEDED(EnumDynamicTimeZoneInformation(index++, &dtzInfo))) { - QWinDynamicTimeZone item; - item.timezoneName = QString::fromWCharArray(dtzInfo.TimeZoneKeyName); - // As soon as key name repeats, break. Some systems continue to always - // return the last item independent of index being out of range - if (item.timezoneName == prevTimeZoneKeyName) - break; - item.standardName = QString::fromWCharArray(dtzInfo.StandardName); - item.daylightName = QString::fromWCharArray(dtzInfo.DaylightName); - item.daylightTime = !dtzInfo.DynamicDaylightTimeDisabled; - item.bias = dtzInfo.Bias; - gTimeZones->insert(item.timezoneName.toUtf8(), item); - prevTimeZoneKeyName = item.timezoneName; - } -} - -DYNAMIC_TIME_ZONE_INFORMATION dynamicInfoForId(const QByteArray &windowsId) -{ - DYNAMIC_TIME_ZONE_INFORMATION dtzInfo; - quint32 index = 0; - QString prevTimeZoneKeyName; - while (SUCCEEDED(EnumDynamicTimeZoneInformation(index++, &dtzInfo))) { - const QString timeZoneName = QString::fromWCharArray(dtzInfo.TimeZoneKeyName); - if (timeZoneName == QLatin1String(windowsId)) - break; - if (timeZoneName == prevTimeZoneKeyName) - break; - prevTimeZoneKeyName = timeZoneName; - } - return dtzInfo; -} - -QWinTimeZonePrivate::QWinTransitionRule -readDynamicRule(DYNAMIC_TIME_ZONE_INFORMATION &dtzi, int year, bool *ok) -{ - TIME_ZONE_INFORMATION tzi; - QWinTimeZonePrivate::QWinTransitionRule rule; - *ok = GetTimeZoneInformationForYear(year, &dtzi, &tzi); - if (*ok) { - rule.startYear = 0; - rule.standardTimeBias = tzi.Bias + tzi.StandardBias; - rule.daylightTimeBias = tzi.Bias + tzi.DaylightBias - rule.standardTimeBias; - rule.standardTimeRule = tzi.StandardDate; - rule.daylightTimeRule = tzi.DaylightDate; - } - return rule; -} -#endif // QT_USE_REGISTRY_TIMEZONE - -bool isSameRule(const QWinTimeZonePrivate::QWinTransitionRule &last, - const QWinTimeZonePrivate::QWinTransitionRule &rule) -{ - // In particular, when this is true and either wYear is 0, so is the other; - // so if one rule is recurrent and they're equal, so is the other. If - // either rule *isn't* recurrent, it has non-0 wYear which shall be - // different from the other's. Note that we don't compare .startYear, since - // that will always be different. - return equalSystemtime(last.standardTimeRule, rule.standardTimeRule) - && equalSystemtime(last.daylightTimeRule, rule.daylightTimeRule) - && last.standardTimeBias == rule.standardTimeBias - && last.daylightTimeBias == rule.daylightTimeBias; -} - -QList availableWindowsIds() -{ -#ifdef QT_USE_REGISTRY_TIMEZONE - // TODO Consider caching results in a global static, very unlikely to change. - QList list; - HKEY key = NULL; - if (openRegistryKey(QString::fromUtf8(tzRegPath), &key)) { - DWORD idCount = 0; - if (RegQueryInfoKey(key, 0, 0, 0, &idCount, 0, 0, 0, 0, 0, 0, 0) == ERROR_SUCCESS - && idCount > 0) { - for (DWORD i = 0; i < idCount; ++i) { - DWORD maxLen = MAX_KEY_LENGTH; - TCHAR buffer[MAX_KEY_LENGTH]; - if (RegEnumKeyEx(key, i, buffer, &maxLen, 0, 0, 0, 0) == ERROR_SUCCESS) - list.append(QString::fromWCharArray(buffer).toUtf8()); - } - } - RegCloseKey(key); - } - return list; -#else // QT_USE_REGISTRY_TIMEZONE - if (gTimeZones->isEmpty()) - enumerateTimeZones(); - return gTimeZones->keys(); -#endif // QT_USE_REGISTRY_TIMEZONE -} - -QByteArray windowsSystemZoneId() -{ -#ifdef QT_USE_REGISTRY_TIMEZONE - // On Vista and later is held in the value TimeZoneKeyName in key currTzRegPath - QString id; - HKEY key = NULL; - QString tziKeyPath = QString::fromUtf8(currTzRegPath); - if (openRegistryKey(tziKeyPath, &key)) { - id = readRegistryString(key, L"TimeZoneKeyName"); - RegCloseKey(key); - if (!id.isEmpty()) - return std::move(id).toUtf8(); - } - - // On XP we have to iterate over the zones until we find a match on - // names/offsets with the current data - TIME_ZONE_INFORMATION sysTzi; - GetTimeZoneInformation(&sysTzi); - bool ok = false; - const auto winIds = availableWindowsIds(); - for (const QByteArray &winId : winIds) { - if (equalTzi(getRegistryTzi(winId, &ok), sysTzi)) - return winId; - } -#else // QT_USE_REGISTRY_TIMEZONE - DYNAMIC_TIME_ZONE_INFORMATION dtzi; - if (SUCCEEDED(GetDynamicTimeZoneInformation(&dtzi))) - return QString::fromWCharArray(dtzi.TimeZoneKeyName).toLocal8Bit(); -#endif // QT_USE_REGISTRY_TIMEZONE - - // If we can't determine the current ID use UTC - return QTimeZonePrivate::utcQByteArray(); -} - -QDate calculateTransitionLocalDate(const SYSTEMTIME &rule, int year) -{ - // If month is 0 then there is no date - if (rule.wMonth == 0) - return QDate(); - - // Interpret SYSTEMTIME according to the slightly quirky rules in: - // https://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx - - // If the year is set, the rule gives an absolute date: - if (rule.wYear) - return QDate(rule.wYear, rule.wMonth, rule.wDay); - - // Otherwise, the rule date is annual and relative: - const int dayOfWeek = rule.wDayOfWeek == 0 ? 7 : rule.wDayOfWeek; - QDate date(year, rule.wMonth, 1); - // How many days before was last dayOfWeek before target month ? - int adjust = dayOfWeek - date.dayOfWeek(); // -6 <= adjust < 7 - if (adjust >= 0) // Ensure -7 <= adjust < 0: - adjust -= 7; - // Normally, wDay is day-within-month; but here it is 1 for the first - // of the given dayOfWeek in the month, through 4 for the fourth or ... - adjust += (rule.wDay < 1 ? 1 : rule.wDay > 4 ? 5 : rule.wDay) * 7; - date = date.addDays(adjust); - // ... 5 for the last; so back up by weeks to get within the month: - if (date.month() != rule.wMonth) { - Q_ASSERT(rule.wDay > 4); - // (Note that, with adjust < 0, date <= 28th of our target month - // is guaranteed when wDay <= 4, or after our first -7 here.) - date = date.addDays(-7); - Q_ASSERT(date.month() == rule.wMonth); - } - return date; -} - -// Converts a date/time value into msecs -inline qint64 timeToMSecs(const QDate &date, const QTime &time) -{ - return ((date.toJulianDay() - JULIAN_DAY_FOR_EPOCH) * MSECS_PER_DAY) - + time.msecsSinceStartOfDay(); -} - -qint64 calculateTransitionForYear(const SYSTEMTIME &rule, int year, int bias) -{ - // TODO Consider caching the calculated values - i.e. replace SYSTEMTIME in - // WinTransitionRule; do this in init() once and store the results. - const QDate date = calculateTransitionLocalDate(rule, year); - const QTime time = QTime(rule.wHour, rule.wMinute, rule.wSecond); - if (date.isValid() && time.isValid()) - return timeToMSecs(date, time) + bias * 60000; - return QTimeZonePrivate::invalidMSecs(); -} - -struct TransitionTimePair -{ - // Transition times after the epoch, in ms: - qint64 std, dst; - // If either is invalidMSecs(), which shall then be < the other, there is no - // DST and the other describes a change in actual standard offset. - - TransitionTimePair(const QWinTimeZonePrivate::QWinTransitionRule &rule, - int year, int oldYearOffset) - // The local time in Daylight Time of the switch to Standard Time - : std(calculateTransitionForYear(rule.standardTimeRule, year, - rule.standardTimeBias + rule.daylightTimeBias)), - // The local time in Standard Time of the switch to Daylight Time - dst(calculateTransitionForYear(rule.daylightTimeRule, year, rule.standardTimeBias)) - { - /* - Check for potential "fake DST", used by MS's APIs because the - TIME_ZONE_INFORMATION spec either expresses no transitions in the - year, or expresses a transition of each kind, even if standard time - did change in a year with no DST. We've seen year-start fake-DST - (whose offset matches prior standard offset, in which the previous - year ended); and conjecture that similar might be used at a year-end. - (This might be used for a southern-hemisphere zone, where the start of - the year usually is in DST, when applicable.) Note that, here, wDay - identifies an instance of a given day-of-week in the month, with 5 - meaning last. - - Either the alleged standardTimeRule or the alleged daylightTimeRule - may be faked; either way, the transition is actually a change to the - current standard offset; but the unfaked half of the rule contains the - useful bias data, so we have to go along with its lies. - - Example: Russia/Moscow - Format: -bias +( -stdBias, stdDate | -dstBias, dstDate ) notes - Last year of DST, 2010: 180 +( 0, 0-10-5 3:0 | 60, 0-3-5 2:0 ) normal DST - Zone change in 2011: 180 +( 0, 0-1-1 0:0 | 60 0-3-5 2:0 ) fake DST at transition - Fixed standard in 2012: 240 +( 0, 0-0-0 0:0 | 60, 0-0-0 0:0 ) standard time years - Zone change in 2014: 180 +( 0, 0-10-5 2:0 | 60, 0-1-1 0:0 ) fake DST at year-start - The last of these is missing on Win7 VMs (too old to know about it). - */ - if (rule.daylightTimeRule.wMonth == 1 && rule.daylightTimeRule.wDay == 1) { - // Fake "DST transition" at start of year producing the same offset as - // previous year ended in. - if (rule.standardTimeBias + rule.daylightTimeBias == oldYearOffset) - dst = QTimeZonePrivate::invalidMSecs(); - } else if (rule.daylightTimeRule.wMonth == 12 && rule.daylightTimeRule.wDay > 3) { - // Similar, conjectured, for end of year, not changing offset. - if (rule.daylightTimeBias == 0) - dst = QTimeZonePrivate::invalidMSecs(); - } - if (rule.standardTimeRule.wMonth == 1 && rule.standardTimeRule.wDay == 1) { - // Fake "transition out of DST" at start of year producing the same - // offset as previous year ended in. - if (rule.standardTimeBias == oldYearOffset) - std = QTimeZonePrivate::invalidMSecs(); - } else if (rule.standardTimeRule.wMonth == 12 && rule.standardTimeRule.wDay > 3) { - // Similar, conjectured, for end of year, not changing offset. - if (rule.daylightTimeBias == 0) - std = QTimeZonePrivate::invalidMSecs(); - } - } - - bool fakesDst() const - { - return std == QTimeZonePrivate::invalidMSecs() - || dst == QTimeZonePrivate::invalidMSecs(); - } -}; - -int yearEndOffset(const QWinTimeZonePrivate::QWinTransitionRule &rule, int year) -{ - int offset = rule.standardTimeBias; - // Only needed to help another TransitionTimePair work out year + 1's start - // offset; and the oldYearOffset we use only affects an alleged transition - // at the *start* of this year, so it doesn't matter if we guess wrong here: - TransitionTimePair pair(rule, year, offset); - if (pair.dst > pair.std) - offset += rule.daylightTimeBias; - return offset; -} - -QLocale::Country userCountry() -{ - const GEOID id = GetUserGeoID(GEOCLASS_NATION); - wchar_t code[3]; - const int size = GetGeoInfo(id, GEO_ISO2, code, 3, 0); - return (size == 3) ? QLocalePrivate::codeToCountry(QStringView(code, size)) - : QLocale::AnyCountry; -} - -// Index of last rule in rules with .startYear <= year: -int ruleIndexForYear(const QList &rules, int year) -{ - if (rules.last().startYear <= year) - return rules.count() - 1; - // We don't have a rule for before the first, but the first is the best we can offer: - if (rules.first().startYear > year) - return 0; - - // Otherwise, use binary chop: - int lo = 0, hi = rules.count(); - // invariant: rules[i].startYear <= year < rules[hi].startYear - // subject to treating rules[rules.count()] as "off the end of time" - while (lo + 1 < hi) { - const int mid = (lo + hi) / 2; - // lo + 2 <= hi, so lo + 1 <= mid <= hi - 1, so lo < mid < hi - // In particular, mid < rules.count() - const int midYear = rules.at(mid).startYear; - if (midYear > year) - hi = mid; - else if (midYear < year) - lo = mid; - else // No two rules have the same startYear: - return mid; - } - return lo; -} - -} // anonymous namespace - -// Create the system default time zone -QWinTimeZonePrivate::QWinTimeZonePrivate() - : QTimeZonePrivate() -{ - init(QByteArray()); -} - -// Create a named time zone -QWinTimeZonePrivate::QWinTimeZonePrivate(const QByteArray &ianaId) - : QTimeZonePrivate() -{ - init(ianaId); -} - -QWinTimeZonePrivate::QWinTimeZonePrivate(const QWinTimeZonePrivate &other) - : QTimeZonePrivate(other), m_windowsId(other.m_windowsId), - m_displayName(other.m_displayName), m_standardName(other.m_standardName), - m_daylightName(other.m_daylightName), m_tranRules(other.m_tranRules) -{ -} - -QWinTimeZonePrivate::~QWinTimeZonePrivate() -{ -} - -QWinTimeZonePrivate *QWinTimeZonePrivate::clone() const -{ - return new QWinTimeZonePrivate(*this); -} - -void QWinTimeZonePrivate::init(const QByteArray &ianaId) -{ - if (ianaId.isEmpty()) { - m_windowsId = windowsSystemZoneId(); - m_id = systemTimeZoneId(); - } else { - m_windowsId = ianaIdToWindowsId(ianaId); - m_id = ianaId; - } - - bool badMonth = false; // Only warn once per zone, if at all. - if (!m_windowsId.isEmpty()) { -#ifdef QT_USE_REGISTRY_TIMEZONE - // Open the base TZI for the time zone - HKEY baseKey = NULL; - const QString baseKeyPath = QString::fromUtf8(tzRegPath) + QLatin1Char('\\') - + QString::fromUtf8(m_windowsId); - if (openRegistryKey(baseKeyPath, &baseKey)) { - // Load the localized names - m_displayName = readRegistryString(baseKey, L"Display"); - m_standardName = readRegistryString(baseKey, L"Std"); - m_daylightName = readRegistryString(baseKey, L"Dlt"); - // On Vista and later the optional dynamic key holds historic data - const QString dynamicKeyPath = baseKeyPath + QLatin1String("\\Dynamic DST"); - HKEY dynamicKey = NULL; - if (openRegistryKey(dynamicKeyPath, &dynamicKey)) { - // Find out the start and end years stored, then iterate over them - int startYear = readRegistryValue(dynamicKey, L"FirstEntry"); - int endYear = readRegistryValue(dynamicKey, L"LastEntry"); - for (int year = startYear; year <= endYear; ++year) { - bool ruleOk; - QWinTransitionRule rule = readRegistryRule(dynamicKey, - reinterpret_cast(QString::number(year).utf16()), - &ruleOk); - if (ruleOk - // Don't repeat a recurrent rule: - && (m_tranRules.isEmpty() - || !isSameRule(m_tranRules.last(), rule))) { - if (!badMonth - && (rule.standardTimeRule.wMonth == 0) - != (rule.daylightTimeRule.wMonth == 0)) { - badMonth = true; - qWarning("MS registry TZ API violated its wMonth constraint;" - "this may cause mistakes for %s from %d", - ianaId.constData(), year); - } - rule.startYear = m_tranRules.isEmpty() ? MIN_YEAR : year; - m_tranRules.append(rule); - } - } - RegCloseKey(dynamicKey); - } else { - // No dynamic data so use the base data - bool ruleOk; - QWinTransitionRule rule = readRegistryRule(baseKey, L"TZI", &ruleOk); - rule.startYear = MIN_YEAR; - if (ruleOk) - m_tranRules.append(rule); - } - RegCloseKey(baseKey); - } -#else // QT_USE_REGISTRY_TIMEZONE - if (gTimeZones->isEmpty()) - enumerateTimeZones(); - QWinRTTimeZoneHash::const_iterator it = gTimeZones->find(m_windowsId); - if (it != gTimeZones->constEnd()) { - m_displayName = it->timezoneName; - m_standardName = it->standardName; - m_daylightName = it->daylightName; - DWORD firstYear = 0; - DWORD lastYear = 0; - DYNAMIC_TIME_ZONE_INFORMATION dtzi = dynamicInfoForId(m_windowsId); - if (GetDynamicTimeZoneInformationEffectiveYears(&dtzi, &firstYear, &lastYear) - == ERROR_SUCCESS && firstYear < lastYear) { - for (DWORD year = firstYear; year <= lastYear; ++year) { - bool ok = false; - QWinTransitionRule rule = readDynamicRule(dtzi, year, &ok); - if (ok - // Don't repeat a recurrent rule - && (m_tranRules.isEmpty() - || !isSameRule(m_tranRules.last(), rule))) { - if (!badMonth - && (rule.standardTimeRule.wMonth == 0) - != (rule.daylightTimeRule.wMonth == 0)) { - badMonth = true; - qWarning("MS dynamic TZ API violated its wMonth constraint;" - "this may cause mistakes for %s from %d", - ianaId.constData(), year); - } - rule.startYear = m_tranRules.isEmpty() ? MIN_YEAR : year; - m_tranRules.append(rule); - } - } - } else { - // At least try to get the non-dynamic data: - dtzi.DynamicDaylightTimeDisabled = false; - bool ok = false; - QWinTransitionRule rule = readDynamicRule(dtzi, 1970, &ok); - if (ok) { - rule.startYear = MIN_YEAR; - m_tranRules.append(rule); - } - } - } -#endif // QT_USE_REGISTRY_TIMEZONE - } - - // If there are no rules then we failed to find a windowsId or any tzi info - if (m_tranRules.size() == 0) { - m_id.clear(); - m_windowsId.clear(); - m_displayName.clear(); - } -} - -QString QWinTimeZonePrivate::comment() const -{ - return m_displayName; -} - -QString QWinTimeZonePrivate::displayName(QTimeZone::TimeType timeType, - QTimeZone::NameType nameType, - const QLocale &locale) const -{ - // TODO Registry holds MUI keys, should be able to look up translations? - Q_UNUSED(locale); - - if (nameType == QTimeZone::OffsetName) { - const QWinTransitionRule &rule = - m_tranRules.at(ruleIndexForYear(m_tranRules, QDate::currentDate().year())); - int offset = rule.standardTimeBias; - if (timeType == QTimeZone::DaylightTime) - offset += rule.daylightTimeBias; - return isoOffsetFormat(offset * -60); - } - - switch (timeType) { - case QTimeZone::DaylightTime : - return m_daylightName; - case QTimeZone::GenericTime : - return m_displayName; - case QTimeZone::StandardTime : - return m_standardName; - } - return m_standardName; -} - -QString QWinTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const -{ - return data(atMSecsSinceEpoch).abbreviation; -} - -int QWinTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const -{ - return data(atMSecsSinceEpoch).offsetFromUtc; -} - -int QWinTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const -{ - return data(atMSecsSinceEpoch).standardTimeOffset; -} - -int QWinTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const -{ - return data(atMSecsSinceEpoch).daylightTimeOffset; -} - -bool QWinTimeZonePrivate::hasDaylightTime() const -{ - return hasTransitions(); -} - -bool QWinTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const -{ - return (data(atMSecsSinceEpoch).daylightTimeOffset != 0); -} - -QTimeZonePrivate::Data QWinTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const -{ - int year = msecsToDate(forMSecsSinceEpoch).year(); - for (int ruleIndex = ruleIndexForYear(m_tranRules, year); - ruleIndex >= 0; --ruleIndex) { - const QWinTransitionRule &rule = m_tranRules.at(ruleIndex); - // Does this rule's period include any transition at all ? - if (rule.standardTimeRule.wMonth > 0 || rule.daylightTimeRule.wMonth > 0) { - const int endYear = qMax(rule.startYear, year - 1); - while (year >= endYear) { - const int newYearOffset = (year <= rule.startYear && ruleIndex > 0) - ? yearEndOffset(m_tranRules.at(ruleIndex - 1), year - 1) - : yearEndOffset(rule, year - 1); - const TransitionTimePair pair(rule, year, newYearOffset); - bool isDst = false; - if (pair.std != invalidMSecs() && pair.std <= forMSecsSinceEpoch) { - isDst = pair.std < pair.dst && pair.dst <= forMSecsSinceEpoch; - } else if (pair.dst != invalidMSecs() && pair.dst <= forMSecsSinceEpoch) { - isDst = true; - } else { - --year; // Try an earlier year for this rule (once). - continue; - } - return ruleToData(rule, forMSecsSinceEpoch, - isDst ? QTimeZone::DaylightTime : QTimeZone::StandardTime, - pair.fakesDst()); - } - // Fell off start of rule, try previous rule. - } else { - // No transition, no DST, use the year's standard time. - return ruleToData(rule, forMSecsSinceEpoch, QTimeZone::StandardTime); - } - if (year >= rule.startYear) - year = rule.startYear - 1; // Seek last transition in new rule. - } - // We don't have relevant data :-( - return invalidData(); -} - -bool QWinTimeZonePrivate::hasTransitions() const -{ - for (const QWinTransitionRule &rule : m_tranRules) { - if (rule.standardTimeRule.wMonth > 0 && rule.daylightTimeRule.wMonth > 0) - return true; - } - return false; -} - -QTimeZonePrivate::Data QWinTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const -{ - int year = msecsToDate(afterMSecsSinceEpoch).year(); - for (int ruleIndex = ruleIndexForYear(m_tranRules, year); - ruleIndex < m_tranRules.count(); ++ruleIndex) { - const QWinTransitionRule &rule = m_tranRules.at(ruleIndex); - // Does this rule's period include any transition at all ? - if (rule.standardTimeRule.wMonth > 0 || rule.daylightTimeRule.wMonth > 0) { - if (year < rule.startYear) - year = rule.startYear; // Seek first transition in this rule. - const int endYear = ruleIndex + 1 < m_tranRules.count() - ? qMin(m_tranRules.at(ruleIndex + 1).startYear, year + 2) : (year + 2); - int newYearOffset = (year <= rule.startYear && ruleIndex > 0) - ? yearEndOffset(m_tranRules.at(ruleIndex - 1), year - 1) - : yearEndOffset(rule, year - 1); - while (year < endYear) { - const TransitionTimePair pair(rule, year, newYearOffset); - bool isDst = false; - Q_ASSERT(invalidMSecs() <= afterMSecsSinceEpoch); // invalid is min qint64 - if (pair.std > afterMSecsSinceEpoch) { - isDst = pair.std > pair.dst && pair.dst > afterMSecsSinceEpoch; - } else if (pair.dst > afterMSecsSinceEpoch) { - isDst = true; - } else { - newYearOffset = rule.standardTimeBias; - if (pair.dst > pair.std) - newYearOffset += rule.daylightTimeBias; - ++year; // Try a later year for this rule (once). - continue; - } - - if (isDst) - return ruleToData(rule, pair.dst, QTimeZone::DaylightTime, pair.fakesDst()); - return ruleToData(rule, pair.std, QTimeZone::StandardTime, pair.fakesDst()); - } - // Fell off end of rule, try next rule. - } // else: no transition during rule's period - } - // Apparently no transition after the given time: - return invalidData(); -} - -QTimeZonePrivate::Data QWinTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const -{ - const qint64 startOfTime = invalidMSecs() + 1; - if (beforeMSecsSinceEpoch <= startOfTime) - return invalidData(); - - int year = msecsToDate(beforeMSecsSinceEpoch).year(); - for (int ruleIndex = ruleIndexForYear(m_tranRules, year); - ruleIndex >= 0; --ruleIndex) { - const QWinTransitionRule &rule = m_tranRules.at(ruleIndex); - // Does this rule's period include any transition at all ? - if (rule.standardTimeRule.wMonth > 0 || rule.daylightTimeRule.wMonth > 0) { - const int endYear = qMax(rule.startYear, year - 1); - while (year >= endYear) { - const int newYearOffset = (year <= rule.startYear && ruleIndex > 0) - ? yearEndOffset(m_tranRules.at(ruleIndex - 1), year - 1) - : yearEndOffset(rule, year - 1); - const TransitionTimePair pair(rule, year, newYearOffset); - bool isDst = false; - if (pair.std != invalidMSecs() && pair.std < beforeMSecsSinceEpoch) { - isDst = pair.std < pair.dst && pair.dst < beforeMSecsSinceEpoch; - } else if (pair.dst != invalidMSecs() && pair.dst < beforeMSecsSinceEpoch) { - isDst = true; - } else { - --year; // Try an earlier year for this rule (once). - continue; - } - if (isDst) - return ruleToData(rule, pair.dst, QTimeZone::DaylightTime, pair.fakesDst()); - return ruleToData(rule, pair.std, QTimeZone::StandardTime, pair.fakesDst()); - } - // Fell off start of rule, try previous rule. - } else if (ruleIndex == 0) { - // Treat a no-transition first rule as a transition at the start of - // time, so that a scan through all rules *does* see it as the first - // rule: - return ruleToData(rule, startOfTime, QTimeZone::StandardTime, false); - } // else: no transition during rule's period - if (year >= rule.startYear) - year = rule.startYear - 1; // Seek last transition in new rule - } - // Apparently no transition before the given time: - return invalidData(); -} - -QByteArray QWinTimeZonePrivate::systemTimeZoneId() const -{ - const QLocale::Country country = userCountry(); - const QByteArray windowsId = windowsSystemZoneId(); - QByteArray ianaId; - // If we have a real country, then try get a specific match for that country - if (country != QLocale::AnyCountry) - ianaId = windowsIdToDefaultIanaId(windowsId, country); - // If we don't have a real country, or there wasn't a specific match, try the global default - if (ianaId.isEmpty()) { - ianaId = windowsIdToDefaultIanaId(windowsId); - // If no global default then probably an unknown Windows ID so return UTC - if (ianaId.isEmpty()) - return utcQByteArray(); - } - return ianaId; -} - -QList QWinTimeZonePrivate::availableTimeZoneIds() const -{ - QList result; - const auto winIds = availableWindowsIds(); - for (const QByteArray &winId : winIds) - result += windowsIdToIanaIds(winId); - std::sort(result.begin(), result.end()); - result.erase(std::unique(result.begin(), result.end()), result.end()); - return result; -} - -QTimeZonePrivate::Data QWinTimeZonePrivate::ruleToData(const QWinTransitionRule &rule, - qint64 atMSecsSinceEpoch, - QTimeZone::TimeType type, - bool fakeDst) const -{ - Data tran = invalidData(); - tran.atMSecsSinceEpoch = atMSecsSinceEpoch; - tran.standardTimeOffset = rule.standardTimeBias * -60; - if (fakeDst) { - tran.daylightTimeOffset = 0; - tran.abbreviation = m_standardName; - // Rule may claim we're in DST when it's actually a standard time change: - if (type == QTimeZone::DaylightTime) - tran.standardTimeOffset += rule.daylightTimeBias * -60; - } else if (type == QTimeZone::DaylightTime) { - tran.daylightTimeOffset = rule.daylightTimeBias * -60; - tran.abbreviation = m_daylightName; - } else { - tran.daylightTimeOffset = 0; - tran.abbreviation = m_standardName; - } - tran.offsetFromUtc = tran.standardTimeOffset + tran.daylightTimeOffset; - return tran; -} - -QT_END_NAMESPACE diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri index 5dcb6c9ee0..52eddd5d6b 100644 --- a/src/corelib/tools/tools.pri +++ b/src/corelib/tools/tools.pri @@ -20,8 +20,6 @@ HEADERS += \ tools/qcontainerfwd.h \ tools/qcontainertools_impl.h \ tools/qcryptographichash.h \ - tools/qdatetime.h \ - tools/qdatetime_p.h \ tools/qdoublescanprint_p.h \ tools/qeasingcurve.h \ tools/qfreelist_p.h \ @@ -86,7 +84,6 @@ SOURCES += \ tools/qbytearraymatcher.cpp \ tools/qcollator.cpp \ tools/qcryptographichash.cpp \ - tools/qdatetime.cpp \ tools/qeasingcurve.cpp \ tools/qfreelist.cpp \ tools/qhash.cpp \ @@ -154,33 +151,6 @@ qtConfig(icu) { SOURCES += tools/qcollator_posix.cpp } -qtConfig(timezone) { - HEADERS += \ - tools/qtimezone.h \ - tools/qtimezoneprivate_p.h \ - tools/qtimezoneprivate_data_p.h - SOURCES += \ - tools/qtimezone.cpp \ - tools/qtimezoneprivate.cpp - !nacl:darwin: { - SOURCES += tools/qtimezoneprivate_mac.mm - } else: android:!android-embedded: { - SOURCES += tools/qtimezoneprivate_android.cpp - } else: unix: { - SOURCES += tools/qtimezoneprivate_tz.cpp - qtConfig(icu): SOURCES += tools/qtimezoneprivate_icu.cpp - } else: qtConfig(icu): { - SOURCES += tools/qtimezoneprivate_icu.cpp - } else: win32: { - SOURCES += tools/qtimezoneprivate_win.cpp - } -} - -qtConfig(datetimeparser) { - HEADERS += tools/qdatetimeparser_p.h - SOURCES += tools/qdatetimeparser.cpp -} - qtConfig(regularexpression) { QMAKE_USE_PRIVATE += pcre2 -- cgit v1.2.3 From c7e6407f84eb51db64871a001dc44010d822061c Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Wed, 29 May 2019 12:22:09 +0200 Subject: Move container block-size calculations to qarraydata.cpp These were in qbytearray.cpp, which doesn't use them, is big and I intend to move it to a different directory than the header, qtools_p.h, that declares them. So move them to a small file that does use them. Change-Id: I5a4684f8c7628e617546019cc3f01d92d829f085 Reviewed-by: Thiago Macieira --- src/corelib/tools/qarraydata.cpp | 105 ++++++++++++++++++++++++++++++++++++++- src/corelib/tools/qbytearray.cpp | 102 +------------------------------------ src/corelib/tools/qtools_p.h | 4 +- 3 files changed, 107 insertions(+), 104 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qarraydata.cpp b/src/corelib/tools/qarraydata.cpp index bcc0688a91..88d8b8244d 100644 --- a/src/corelib/tools/qarraydata.cpp +++ b/src/corelib/tools/qarraydata.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2019 The Qt Company Ltd. ** Copyright (C) 2016 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** @@ -41,11 +41,114 @@ #include #include #include +#include #include QT_BEGIN_NAMESPACE +/* + * This pair of functions is declared in qtools_p.h and is used by the Qt + * containers to allocate memory and grow the memory block during append + * operations. + * + * They take size_t parameters and return size_t so they will change sizes + * according to the pointer width. However, knowing Qt containers store the + * container size and element indexes in ints, these functions never return a + * size larger than INT_MAX. This is done by casting the element count and + * memory block size to int in several comparisons: the check for negative is + * very fast on most platforms as the code only needs to check the sign bit. + * + * These functions return SIZE_MAX on overflow, which can be passed to malloc() + * and will surely cause a NULL return (there's no way you can allocate a + * memory block the size of your entire VM space). + */ + +/*! + \internal + \since 5.7 + + Returns the memory block size for a container containing \a elementCount + elements, each of \a elementSize bytes, plus a header of \a headerSize + bytes. That is, this function returns \c + {elementCount * elementSize + headerSize} + + but unlike the simple calculation, it checks for overflows during the + multiplication and the addition. + + Both \a elementCount and \a headerSize can be zero, but \a elementSize + cannot. + + This function returns SIZE_MAX (~0) on overflow or if the memory block size + would not fit an int. +*/ +size_t qCalculateBlockSize(size_t elementCount, size_t elementSize, size_t headerSize) noexcept +{ + unsigned count = unsigned(elementCount); + unsigned size = unsigned(elementSize); + unsigned header = unsigned(headerSize); + Q_ASSERT(elementSize); + Q_ASSERT(size == elementSize); + Q_ASSERT(header == headerSize); + + if (Q_UNLIKELY(count != elementCount)) + return std::numeric_limits::max(); + + unsigned bytes; + if (Q_UNLIKELY(mul_overflow(size, count, &bytes)) || + Q_UNLIKELY(add_overflow(bytes, header, &bytes))) + return std::numeric_limits::max(); + if (Q_UNLIKELY(int(bytes) < 0)) // catches bytes >= 2GB + return std::numeric_limits::max(); + + return bytes; +} + +/*! + \internal + \since 5.7 + + Returns the memory block size and the number of elements that will fit in + that block for a container containing \a elementCount elements, each of \a + elementSize bytes, plus a header of \a headerSize bytes. This function + assumes the container will grow and pre-allocates a growth factor. + + Both \a elementCount and \a headerSize can be zero, but \a elementSize + cannot. + + This function returns SIZE_MAX (~0) on overflow or if the memory block size + would not fit an int. + + \note The memory block may contain up to \a elementSize - 1 bytes more than + needed. +*/ +CalculateGrowingBlockSizeResult +qCalculateGrowingBlockSize(size_t elementCount, size_t elementSize, size_t headerSize) noexcept +{ + CalculateGrowingBlockSizeResult result = { + std::numeric_limits::max(),std::numeric_limits::max() + }; + + unsigned bytes = unsigned(qCalculateBlockSize(elementCount, elementSize, headerSize)); + if (int(bytes) < 0) // catches std::numeric_limits::max() + return result; + + unsigned morebytes = qNextPowerOfTwo(bytes); + if (Q_UNLIKELY(int(morebytes) < 0)) { + // catches morebytes == 2GB + // grow by half the difference between bytes and morebytes + bytes += (morebytes - bytes) / 2; + } else { + bytes = morebytes; + } + + result.elementCount = (bytes - unsigned(headerSize)) / unsigned(elementSize); + result.size = bytes; + return result; +} + +// End of qtools_p.h implementation + QT_WARNING_PUSH QT_WARNING_DISABLE_GCC("-Wmissing-field-initializers") diff --git a/src/corelib/tools/qbytearray.cpp b/src/corelib/tools/qbytearray.cpp index 9816b5cb32..5c2af7e058 100644 --- a/src/corelib/tools/qbytearray.cpp +++ b/src/corelib/tools/qbytearray.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2019 The Qt Company Ltd. ** Copyright (C) 2016 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** @@ -130,106 +130,6 @@ int qFindByteArray( const char *haystack0, int haystackLen, int from, const char *needle0, int needleLen); -/* - * This pair of functions is declared in qtools_p.h and is used by the Qt - * containers to allocate memory and grow the memory block during append - * operations. - * - * They take size_t parameters and return size_t so they will change sizes - * according to the pointer width. However, knowing Qt containers store the - * container size and element indexes in ints, these functions never return a - * size larger than INT_MAX. This is done by casting the element count and - * memory block size to int in several comparisons: the check for negative is - * very fast on most platforms as the code only needs to check the sign bit. - * - * These functions return SIZE_MAX on overflow, which can be passed to malloc() - * and will surely cause a NULL return (there's no way you can allocate a - * memory block the size of your entire VM space). - */ - -/*! - \internal - \since 5.7 - - Returns the memory block size for a container containing \a elementCount - elements, each of \a elementSize bytes, plus a header of \a headerSize - bytes. That is, this function returns \c - {elementCount * elementSize + headerSize} - - but unlike the simple calculation, it checks for overflows during the - multiplication and the addition. - - Both \a elementCount and \a headerSize can be zero, but \a elementSize - cannot. - - This function returns SIZE_MAX (~0) on overflow or if the memory block size - would not fit an int. -*/ -size_t qCalculateBlockSize(size_t elementCount, size_t elementSize, size_t headerSize) noexcept -{ - unsigned count = unsigned(elementCount); - unsigned size = unsigned(elementSize); - unsigned header = unsigned(headerSize); - Q_ASSERT(elementSize); - Q_ASSERT(size == elementSize); - Q_ASSERT(header == headerSize); - - if (Q_UNLIKELY(count != elementCount)) - return std::numeric_limits::max(); - - unsigned bytes; - if (Q_UNLIKELY(mul_overflow(size, count, &bytes)) || - Q_UNLIKELY(add_overflow(bytes, header, &bytes))) - return std::numeric_limits::max(); - if (Q_UNLIKELY(int(bytes) < 0)) // catches bytes >= 2GB - return std::numeric_limits::max(); - - return bytes; -} - -/*! - \internal - \since 5.7 - - Returns the memory block size and the number of elements that will fit in - that block for a container containing \a elementCount elements, each of \a - elementSize bytes, plus a header of \a headerSize bytes. This function - assumes the container will grow and pre-allocates a growth factor. - - Both \a elementCount and \a headerSize can be zero, but \a elementSize - cannot. - - This function returns SIZE_MAX (~0) on overflow or if the memory block size - would not fit an int. - - \note The memory block may contain up to \a elementSize - 1 bytes more than - needed. -*/ -CalculateGrowingBlockSizeResult -qCalculateGrowingBlockSize(size_t elementCount, size_t elementSize, size_t headerSize) noexcept -{ - CalculateGrowingBlockSizeResult result = { - std::numeric_limits::max(),std::numeric_limits::max() - }; - - unsigned bytes = unsigned(qCalculateBlockSize(elementCount, elementSize, headerSize)); - if (int(bytes) < 0) // catches std::numeric_limits::max() - return result; - - unsigned morebytes = qNextPowerOfTwo(bytes); - if (Q_UNLIKELY(int(morebytes) < 0)) { - // catches morebytes == 2GB - // grow by half the difference between bytes and morebytes - bytes += (morebytes - bytes) / 2; - } else { - bytes = morebytes; - } - - result.elementCount = (bytes - unsigned(headerSize)) / unsigned(elementSize); - result.size = bytes; - return result; -} - /***************************************************************************** Safe and portable C string functions; extensions to standard string.h *****************************************************************************/ diff --git a/src/corelib/tools/qtools_p.h b/src/corelib/tools/qtools_p.h index b239987871..d48318b474 100644 --- a/src/corelib/tools/qtools_p.h +++ b/src/corelib/tools/qtools_p.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2019 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -96,7 +96,7 @@ struct CalculateGrowingBlockSizeResult { size_t elementCount; }; -// implemented in qbytearray.cpp +// Implemented in qarraydata.cpp: size_t Q_CORE_EXPORT Q_DECL_CONST_FUNCTION qCalculateBlockSize(size_t elementCount, size_t elementSize, size_t headerSize = 0) noexcept; CalculateGrowingBlockSizeResult Q_CORE_EXPORT Q_DECL_CONST_FUNCTION -- cgit v1.2.3 From 325d5b58a25a2893261c2c69fc8381abc87cceac Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Tue, 28 May 2019 17:39:14 +0200 Subject: Regenerate Windows Time Zone ID table Re-ran util/locale_database/cldr2qtimezone.py to add new zones to the table. Change-Id: I70258a9abbe9815494291deff528f3c18703de40 Reviewed-by: Thiago Macieira --- src/corelib/tools/qtimezoneprivate_data_p.h | 2101 ++++++++++++++------------- 1 file changed, 1102 insertions(+), 999 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qtimezoneprivate_data_p.h b/src/corelib/tools/qtimezoneprivate_data_p.h index 5cedac3b49..40d6c972c2 100644 --- a/src/corelib/tools/qtimezoneprivate_data_p.h +++ b/src/corelib/tools/qtimezoneprivate_data_p.h @@ -114,8 +114,8 @@ struct QUtcData { // GENERATED PART STARTS HERE /* - This part of the file was generated on 2017-05-23 from the - Common Locale Data Repository v29 supplemental/windowsZones.xml file $Revision: 12348 $ + This part of the file was generated on 2019-05-28 from the + Common Locale Data Repository v35.1 supplemental/windowsZones.xml file $Revision: 14742 $ http://www.unicode.org/cldr/ @@ -125,1027 +125,1130 @@ struct QUtcData { // Windows ID Key, Country Enum, IANA ID Index static const QZoneData zoneDataTable[] = { - { 22, 57, 0 }, // Central Europe Standard Time / CzechRepublic - { 69, 139, 14 }, // Pacific Standard Time / Mexico - { 53, 188, 51 }, // Mauritius Standard Time / Seychelles - { 50, 122, 63 }, // Libya Standard Time / Libya - { 79, 38, 78 }, // SA Western Standard Time / Canada - { 83, 35, 99 }, // South Africa Standard Time / Burundi - { 102, 205, 116 }, // W. Europe Standard Time / Sweden - { 89, 213, 133 }, // Tonga Standard Time / Tokelau - { 77, 76, 149 }, // SA Eastern Standard Time / FrenchGuiana - { 79, 215, 165 }, // SA Western Standard Time / TrinidadAndTobago - { 69, 38, 187 }, // Pacific Standard Time / Canada - { 97, 0, 239 }, // UTC+12 / AnyCountry - { 19, 65, 250 }, // Central America Standard Time / ElSalvador - { 82, 101, 270 }, // Singapore Standard Time / Indonesia - { 37, 248, 284 }, // FLE Standard Time / AlandIslands - { 16, 0, 301 }, // Cape Verde Standard Time / AnyCountry - { 97, 220, 311 }, // UTC+12 / Tuvalu - { 79, 182, 328 }, // SA Western Standard Time / SaintVincentAndTheGrenadines - { 83, 179, 347 }, // South Africa Standard Time / Rwanda - { 102, 125, 361 }, // W. Europe Standard Time / Luxembourg - { 41, 34, 379 }, // Greenwich Standard Time / BurkinaFaso - { 20, 116, 398 }, // Central Asia Standard Time / Kyrgyzstan - { 101, 216, 411 }, // W. Central Africa Standard Time / Tunisia - { 101, 79, 424 }, // W. Central Africa Standard Time / Gabon - { 19, 96, 442 }, // Central America Standard Time / Honduras - { 81, 36, 462 }, // SE Asia Standard Time / Cambodia - { 82, 170, 478 }, // Singapore Standard Time / Philippines - { 101, 41, 490 }, // W. Central Africa Standard Time / CentralAfricanRepublic - { 5, 103, 504 }, // Arabic Standard Time / Iraq - { 72, 21, 517 }, // Romance Standard Time / Belgium - { 74, 178, 533 }, // Russia Time Zone 10 / Russia - { 20, 44, 552 }, // Central Asia Standard Time / China - { 3, 17, 564 }, // Arab Standard Time / Bahrain - { 88, 62, 577 }, // Tokyo Standard Time / EastTimor - { 37, 68, 587 }, // FLE Standard Time / Estonia - { 41, 136, 602 }, // Greenwich Standard Time / Mauritania - { 83, 49, 620 }, // South Africa Standard Time / CongoKinshasa - { 72, 74, 638 }, // Romance Standard Time / France - { 35, 178, 651 }, // Ekaterinburg Standard Time / Russia - { 32, 16, 670 }, // Eastern Standard Time / Bahamas - { 94, 30, 685 }, // UTC-02 / Brazil - { 12, 30, 701 }, // Bahia Standard Time / Brazil - { 82, 0, 715 }, // Singapore Standard Time / AnyCountry - { 29, 201, 725 }, // E. Africa Standard Time / Sudan - { 24, 229, 741 }, // Central Pacific Standard Time / Vanuatu - { 55, 227, 755 }, // Montevideo Standard Time / Uruguay - { 79, 233, 774 }, // SA Western Standard Time / BritishVirginIslands - { 29, 221, 790 }, // E. Africa Standard Time / Uganda - { 101, 6, 805 }, // W. Central Africa Standard Time / Angola - { 68, 141, 819 }, // E. Europe Standard Time / Moldova - { 51, 112, 835 }, // Line Islands Standard Time / Kiribati - { 89, 0, 854 }, // Tonga Standard Time / AnyCountry - { 79, 61, 865 }, // SA Western Standard Time / DominicanRepublic - { 39, 75, 887 }, // GMT Standard Time / Guernsey - { 37, 222, 903 }, // FLE Standard Time / Ukraine - { 83, 28, 949 }, // South Africa Standard Time / Botswana - { 82, 130, 965 }, // Singapore Standard Time / Malaysia - { 95, 4, 996 }, // UTC-11 / AmericanSamoa - { 41, 189, 1014 }, // Greenwich Standard Time / SierraLeone - { 29, 194, 1030 }, // E. Africa Standard Time / Somalia - { 94, 196, 1047 }, // UTC-02 / SouthGeorgiaAndTheSouthSandwichIslands - { 96, 0, 1070 }, // UTC / AnyCountry - { 101, 37, 1078 }, // W. Central Africa Standard Time / Cameroon - { 13, 25, 1092 }, // Bangladesh Standard Time / Bhutan - { 102, 151, 1105 }, // W. Europe Standard Time / Netherlands - { 37, 118, 1122 }, // FLE Standard Time / Latvia - { 29, 48, 1134 }, // E. Africa Standard Time / Comoros - { 60, 178, 1148 }, // N. Central Asia Standard Time / Russia - { 81, 117, 1175 }, // SE Asia Standard Time / Laos - { 22, 242, 1190 }, // Central Europe Standard Time / Montenegro - { 37, 33, 1207 }, // FLE Standard Time / Bulgaria - { 11, 173, 1220 }, // Azores Standard Time / Portugal - { 97, 149, 1236 }, // UTC+12 / Nauru - { 83, 146, 1250 }, // South Africa Standard Time / Mozambique - { 102, 82, 1264 }, // W. Europe Standard Time / Germany - { 79, 255, 1294 }, // SA Western Standard Time / Bonaire - { 24, 153, 1313 }, // Central Pacific Standard Time / NewCaledonia - { 45, 102, 1328 }, // Iran Standard Time / Iran - { 13, 18, 1340 }, // Bangladesh Standard Time / Bangladesh - { 69, 225, 1351 }, // Pacific Standard Time / UnitedStates - { 102, 142, 1371 }, // W. Europe Standard Time / Monaco - { 29, 128, 1385 }, // E. Africa Standard Time / Madagascar - { 65, 178, 1405 }, // North Asia East Standard Time / Russia - { 20, 8, 1418 }, // Central Asia Standard Time / Antarctica - { 22, 2, 1436 }, // Central Europe Standard Time / Albania - { 79, 87, 1450 }, // SA Western Standard Time / Grenada - { 81, 0, 1466 }, // SE Asia Standard Time / AnyCountry - { 39, 173, 1476 }, // GMT Standard Time / Portugal - { 103, 228, 1507 }, // West Asia Standard Time / Uzbekistan - { 58, 139, 1536 }, // Mountain Standard Time / Mexico - { 83, 129, 1552 }, // South Africa Standard Time / Malawi - { 78, 107, 1568 }, // SA Pacific Standard Time / Jamaica - { 41, 91, 1584 }, // Greenwich Standard Time / Guinea - { 101, 49, 1599 }, // W. Central Africa Standard Time / CongoKinshasa - { 43, 226, 1615 }, // Hawaiian Standard Time / UnitedStatesMinorOutlyingIslands - { 77, 8, 1632 }, // SA Eastern Standard Time / Antarctica - { 97, 235, 1651 }, // UTC+12 / WallisAndFutunaIslands - { 81, 232, 1666 }, // SE Asia Standard Time / Vietnam - { 34, 64, 1678 }, // Egypt Standard Time / Egypt - { 102, 106, 1691 }, // W. Europe Standard Time / Italy - { 79, 256, 1703 }, // SA Western Standard Time / SintMaarten - { 59, 147, 1725 }, // Myanmar Standard Time / Myanmar - { 78, 166, 1738 }, // SA Pacific Standard Time / Panama - { 56, 236, 1753 }, // Morocco Standard Time / WesternSahara - { 24, 193, 1769 }, // Central Pacific Standard Time / SolomonIslands - { 48, 178, 1789 }, // Kaliningrad Standard Time / Russia - { 47, 109, 1808 }, // Jordan Standard Time / Jordan - { 42, 177, 1819 }, // GTB Standard Time / Romania - { 41, 92, 1836 }, // Greenwich Standard Time / GuineaBissau - { 102, 184, 1850 }, // W. Europe Standard Time / SanMarino - { 103, 209, 1868 }, // West Asia Standard Time / Tajikistan - { 75, 178, 1882 }, // Russia Time Zone 11 / Russia - { 101, 157, 1909 }, // W. Central Africa Standard Time / Nigeria - { 79, 152, 1922 }, // SA Western Standard Time / CuraSao - { 57, 139, 1938 }, // Mountain Standard Time (Mexico) / Mexico - { 4, 162, 1973 }, // Arabian Standard Time / Oman - { 78, 169, 1985 }, // SA Pacific Standard Time / Peru - { 102, 206, 1998 }, // W. Europe Standard Time / Switzerland - { 41, 99, 2012 }, // Greenwich Standard Time / Iceland - { 33, 139, 2031 }, // Eastern Standard Time (Mexico) / Mexico - { 58, 225, 2046 }, // Mountain Standard Time / UnitedStates - { 100, 8, 2075 }, // W. Australia Standard Time / Antarctica - { 79, 30, 2092 }, // SA Western Standard Time / Brazil - { 101, 23, 2145 }, // W. Central Africa Standard Time / Benin - { 78, 43, 2163 }, // SA Pacific Standard Time / Chile - { 104, 0, 2178 }, // West Pacific Standard Time / AnyCountry - { 79, 181, 2189 }, // SA Western Standard Time / SaintLucia - { 27, 126, 2206 }, // China Standard Time / Macau - { 101, 66, 2217 }, // W. Central Africa Standard Time / EquatorialGuinea - { 43, 51, 2231 }, // Hawaiian Standard Time / CookIslands - { 41, 80, 2249 }, // Greenwich Standard Time / Gambia - { 51, 0, 2263 }, // Line Islands Standard Time / AnyCountry - { 52, 178, 2274 }, // Magadan Standard Time / Russia - { 22, 191, 2287 }, // Central Europe Standard Time / Slovakia - { 102, 5, 2305 }, // W. Europe Standard Time / Andorra - { 81, 211, 2320 }, // SE Asia Standard Time / Thailand - { 103, 0, 2333 }, // West Asia Standard Time / AnyCountry - { 24, 167, 2343 }, // Central Pacific Standard Time / PapuaNewGuinea - { 102, 230, 2364 }, // W. Europe Standard Time / VaticanCityState - { 58, 38, 2379 }, // Mountain Standard Time / Canada - { 77, 202, 2453 }, // SA Eastern Standard Time / Suriname - { 9, 13, 2472 }, // AUS Eastern Standard Time / Australia - { 29, 210, 2509 }, // E. Africa Standard Time / Tanzania - { 58, 0, 2530 }, // Mountain Standard Time / AnyCountry - { 83, 120, 2538 }, // South Africa Standard Time / Lesotho - { 97, 134, 2552 }, // UTC+12 / MarshallIslands - { 29, 111, 2585 }, // E. Africa Standard Time / Kenya - { 103, 218, 2600 }, // West Asia Standard Time / Turkmenistan - { 27, 97, 2614 }, // China Standard Time / HongKong - { 29, 0, 2629 }, // E. Africa Standard Time / AnyCountry - { 19, 22, 2639 }, // Central America Standard Time / Belize - { 31, 30, 2654 }, // E. South America Standard Time / Brazil - { 72, 197, 2672 }, // Romance Standard Time / Spain - { 81, 101, 2699 }, // SE Asia Standard Time / Indonesia - { 88, 0, 2727 }, // Tokyo Standard Time / AnyCountry - { 2, 225, 2737 }, // Alaskan Standard Time / UnitedStates - { 72, 58, 2832 }, // Romance Standard Time / Denmark - { 63, 8, 2850 }, // New Zealand Standard Time / Antarctica - { 3, 175, 2869 }, // Arab Standard Time / Qatar - { 79, 245, 2880 }, // SA Western Standard Time / Saint Martin - { 79, 19, 2896 }, // SA Western Standard Time / Barbados - { 97, 226, 2913 }, // UTC+12 / UnitedStatesMinorOutlyingIslands - { 37, 73, 2926 }, // FLE Standard Time / Finland - { 29, 138, 2942 }, // E. Africa Standard Time / Mayotte - { 39, 71, 2957 }, // GMT Standard Time / FaroeIslands - { 78, 38, 2973 }, // SA Pacific Standard Time / Canada - { 43, 0, 2995 }, // Hawaiian Standard Time / AnyCountry - { 23, 27, 3006 }, // Central European Standard Time / BosniaAndHerzegowina - { 38, 81, 3022 }, // Georgian Standard Time / Georgia - { 95, 0, 3035 }, // UTC-11 / AnyCountry - { 24, 13, 3046 }, // Central Pacific Standard Time / Australia - { 104, 167, 3067 }, // West Pacific Standard Time / PapuaNewGuinea - { 71, 168, 3088 }, // Paraguay Standard Time / Paraguay - { 43, 77, 3105 }, // Hawaiian Standard Time / FrenchPolynesia - { 41, 212, 3120 }, // Greenwich Standard Time / Togo - { 39, 197, 3132 }, // GMT Standard Time / Spain - { 83, 195, 3148 }, // South Africa Standard Time / SouthAfrica - { 18, 13, 3168 }, // Cen. Australia Standard Time / Australia - { 104, 160, 3209 }, // West Pacific Standard Time / NorthernMarianaIslands - { 77, 70, 3224 }, // SA Eastern Standard Time / FalklandIslands - { 42, 56, 3241 }, // GTB Standard Time / Cyprus - { 4, 223, 3254 }, // Arabian Standard Time / UnitedArabEmirates - { 103, 78, 3265 }, // West Asia Standard Time / FrenchSouthernTerritories - { 101, 42, 3282 }, // W. Central Africa Standard Time / Chad - { 23, 127, 3298 }, // Central European Standard Time / Macedonia - { 3, 237, 3312 }, // Arab Standard Time / Yemen - { 80, 183, 3322 }, // Samoa Standard Time / Samoa - { 43, 225, 3335 }, // Hawaiian Standard Time / UnitedStates - { 28, 0, 3352 }, // Dateline Standard Time / AnyCountry - { 93, 139, 3363 }, // US Mountain Standard Time / Mexico - { 64, 38, 3382 }, // Newfoundland Standard Time / Canada - { 63, 154, 3399 }, // New Zealand Standard Time / NewZealand - { 76, 178, 3416 }, // Russian Standard Time / Russia - { 82, 190, 3465 }, // Singapore Standard Time / Singapore - { 1, 1, 3480 }, // Afghanistan Standard Time / Afghanistan - { 102, 133, 3491 }, // W. Europe Standard Time / Malta - { 79, 12, 3504 }, // SA Western Standard Time / Aruba - { 25, 139, 3518 }, // Central Standard Time (Mexico) / Mexico - { 39, 251, 3594 }, // GMT Standard Time / IsleOfMan - { 102, 123, 3613 }, // W. Europe Standard Time / Liechtenstein - { 77, 30, 3626 }, // SA Eastern Standard Time / Brazil - { 49, 114, 3723 }, // Korea Standard Time / SouthKorea - { 79, 88, 3734 }, // SA Western Standard Time / Guadeloupe - { 94, 0, 3753 }, // UTC-02 / AnyCountry - { 59, 46, 3763 }, // Myanmar Standard Time / CocosIslands - { 102, 203, 3776 }, // W. Europe Standard Time / SvalbardAndJanMayenIslands - { 29, 69, 3796 }, // E. Africa Standard Time / Ethiopia - { 73, 178, 3815 }, // Russia Time Zone 3 / Russia - { 83, 240, 3829 }, // South Africa Standard Time / Zimbabwe - { 100, 13, 3843 }, // W. Australia Standard Time / Australia - { 101, 0, 3859 }, // W. Central Africa Standard Time / AnyCountry - { 32, 55, 3869 }, // Eastern Standard Time / Cuba - { 56, 145, 3884 }, // Morocco Standard Time / Morocco - { 17, 11, 3902 }, // Caucasus Standard Time / Armenia - { 7, 24, 3915 }, // Atlantic Standard Time / Bermuda - { 86, 208, 3932 }, // Taipei Standard Time / Taiwan - { 20, 0, 3944 }, // Central Asia Standard Time / AnyCountry - { 40, 86, 3954 }, // Greenland Standard Time / Greenland - { 23, 172, 3970 }, // Central European Standard Time / Poland - { 89, 214, 3984 }, // Tonga Standard Time / Tonga - { 20, 110, 4002 }, // Central Asia Standard Time / Kazakhstan - { 81, 8, 4029 }, // SE Asia Standard Time / Antarctica - { 54, 119, 4046 }, // Middle East Standard Time / Lebanon - { 19, 90, 4058 }, // Central America Standard Time / Guatemala - { 70, 163, 4076 }, // Pakistan Standard Time / Pakistan - { 41, 83, 4089 }, // Greenwich Standard Time / Ghana - { 79, 174, 4102 }, // SA Western Standard Time / PuertoRico - { 79, 26, 4122 }, // SA Western Standard Time / Bolivia - { 32, 225, 4137 }, // Eastern Standard Time / UnitedStates - { 85, 207, 4294 }, // Syria Standard Time / Syria - { 97, 112, 4308 }, // UTC+12 / Kiribati - { 79, 0, 4323 }, // SA Western Standard Time / AnyCountry - { 78, 47, 4333 }, // SA Pacific Standard Time / Colombia - { 16, 39, 4348 }, // Cape Verde Standard Time / CapeVerde - { 8, 13, 4368 }, // AUS Central Standard Time / Australia - { 106, 113, 4385 }, // North Korea Standard Time / NorthKorea - { 10, 15, 4400 }, // Azerbaijan Standard Time / Azerbaijan - { 102, 84, 4410 }, // W. Europe Standard Time / Gibraltar - { 46, 105, 4427 }, // Israel Standard Time / Israel - { 22, 192, 4442 }, // Central Europe Standard Time / Slovenia - { 24, 159, 4459 }, // Central Pacific Standard Time / NorfolkIsland - { 82, 32, 4475 }, // Singapore Standard Time / Brunei - { 101, 50, 4487 }, // W. Central Africa Standard Time / CongoBrazzaville - { 62, 150, 4506 }, // Nepal Standard Time / Nepal - { 44, 100, 4520 }, // India Standard Time / India - { 79, 9, 4534 }, // SA Western Standard Time / AntiguaAndBarbuda - { 39, 252, 4550 }, // GMT Standard Time / Jersey - { 79, 144, 4564 }, // SA Western Standard Time / Montserrat - { 93, 0, 4583 }, // US Mountain Standard Time / AnyCountry - { 79, 93, 4593 }, // SA Western Standard Time / Guyana - { 41, 187, 4608 }, // Greenwich Standard Time / Senegal - { 102, 161, 4621 }, // W. Europe Standard Time / Norway - { 42, 85, 4633 }, // GTB Standard Time / Greece - { 3, 115, 4647 }, // Arab Standard Time / Kuwait - { 24, 140, 4659 }, // Central Pacific Standard Time / Micronesia - { 19, 52, 4689 }, // Central America Standard Time / CostaRica - { 79, 60, 4708 }, // SA Western Standard Time / Dominica - { 83, 204, 4725 }, // South Africa Standard Time / Swaziland - { 79, 135, 4740 }, // SA Western Standard Time / Martinique - { 53, 176, 4759 }, // Mauritius Standard Time / Reunion - { 19, 0, 4774 }, // Central America Standard Time / AnyCountry - { 90, 217, 4784 }, // Turkey Standard Time / Turkey - { 66, 178, 4800 }, // North Asia Standard Time / Russia - { 41, 53, 4835 }, // Greenwich Standard Time / IvoryCoast - { 78, 30, 4850 }, // SA Pacific Standard Time / Brazil - { 26, 0, 4886 }, // Central Standard Time / AnyCountry - { 93, 225, 4894 }, // US Mountain Standard Time / UnitedStates - { 15, 38, 4910 }, // Canada Central Standard Time / Canada - { 78, 0, 4947 }, // SA Pacific Standard Time / AnyCountry - { 103, 8, 4957 }, // West Asia Standard Time / Antarctica - { 103, 131, 4975 }, // West Asia Standard Time / Maldives - { 22, 243, 4991 }, // Central Europe Standard Time / Serbia - { 29, 67, 5007 }, // E. Africa Standard Time / Eritrea - { 93, 38, 5021 }, // US Mountain Standard Time / Canada - { 22, 98, 5078 }, // Central Europe Standard Time / Hungary - { 61, 148, 5094 }, // Namibia Standard Time / Namibia - { 88, 101, 5110 }, // Tokyo Standard Time / Indonesia - { 30, 13, 5124 }, // E. Australia Standard Time / Australia - { 4, 0, 5162 }, // Arabian Standard Time / AnyCountry - { 98, 231, 5172 }, // Venezuela Standard Time / Venezuela - { 29, 8, 5188 }, // E. Africa Standard Time / Antarctica - { 23, 54, 5205 }, // Central European Standard Time / Croatia - { 6, 10, 5219 }, // Argentina Standard Time / Argentina - { 67, 8, 5492 }, // Pacific SA Standard Time / Antarctica - { 32, 38, 5510 }, // Eastern Standard Time / Canada - { 41, 132, 5615 }, // Greenwich Standard Time / Mali - { 3, 186, 5629 }, // Arab Standard Time / SaudiArabia - { 104, 140, 5641 }, // West Pacific Standard Time / Micronesia - { 88, 108, 5654 }, // Tokyo Standard Time / Japan - { 89, 112, 5665 }, // Tonga Standard Time / Kiribati - { 39, 224, 5683 }, // GMT Standard Time / UnitedKingdom - { 92, 225, 5697 }, // US Eastern Standard Time / UnitedStates - { 84, 198, 5764 }, // Sri Lanka Standard Time / SriLanka - { 26, 38, 5777 }, // Central Standard Time / Canada - { 29, 59, 5852 }, // E. Africa Standard Time / Djibouti - { 7, 38, 5868 }, // Atlantic Standard Time / Canada - { 41, 185, 5936 }, // Greenwich Standard Time / SaoTomeAndPrincipe - { 79, 234, 5952 }, // SA Western Standard Time / UnitedStatesVirginIslands - { 83, 239, 5970 }, // South Africa Standard Time / Zambia - { 32, 94, 5984 }, // Eastern Standard Time / Haiti - { 101, 156, 6007 }, // W. Central Africa Standard Time / Niger - { 77, 0, 6021 }, // SA Eastern Standard Time / AnyCountry - { 101, 3, 6031 }, // W. Central Africa Standard Time / Algeria - { 78, 63, 6046 }, // SA Pacific Standard Time / Ecuador - { 20, 31, 6064 }, // Central Asia Standard Time / BritishIndianOceanTerritory - { 27, 44, 6078 }, // China Standard Time / China - { 21, 30, 6092 }, // Central Brazilian Standard Time / Brazil - { 95, 226, 6128 }, // UTC-11 / UnitedStatesMinorOutlyingIslands - { 32, 0, 6143 }, // Eastern Standard Time / AnyCountry - { 81, 45, 6151 }, // SE Asia Standard Time / ChristmasIsland - { 19, 63, 6168 }, // Central America Standard Time / Ecuador - { 79, 7, 6186 }, // SA Western Standard Time / Anguilla - { 78, 40, 6203 }, // SA Pacific Standard Time / CaymanIslands - { 79, 180, 6218 }, // SA Western Standard Time / SaintKittsAndNevis - { 67, 43, 6235 }, // Pacific SA Standard Time / Chile - { 88, 164, 6252 }, // Tokyo Standard Time / Palau - { 105, 178, 6266 }, // Yakutsk Standard Time / Russia - { 37, 124, 6304 }, // FLE Standard Time / Lithuania - { 41, 121, 6319 }, // Greenwich Standard Time / Liberia - { 104, 89, 6335 }, // West Pacific Standard Time / Guam - { 96, 86, 6348 }, // UTC / Greenland - { 36, 72, 6369 }, // Fiji Standard Time / Fiji - { 19, 155, 6382 }, // Central America Standard Time / Nicaragua - { 11, 86, 6398 }, // Azores Standard Time / Greenland - { 79, 244, 6419 }, // SA Western Standard Time / Saint Barthelemy - { 69, 0, 6441 }, // Pacific Standard Time / AnyCountry - { 79, 219, 6449 }, // SA Western Standard Time / TurksAndCaicosIslands - { 103, 110, 6468 }, // West Asia Standard Time / Kazakhstan - { 26, 225, 6501 }, // Central Standard Time / UnitedStates - { 26, 139, 6669 }, // Central Standard Time / Mexico - { 7, 86, 6687 }, // Atlantic Standard Time / Greenland - { 24, 0, 6701 }, // Central Pacific Standard Time / AnyCountry - { 41, 199, 6712 }, // Greenwich Standard Time / SaintHelena - { 95, 158, 6731 }, // UTC-11 / Niue - { 53, 137, 6744 }, // Mauritius Standard Time / Mauritius - { 91, 143, 6761 }, // Ulaanbaatar Standard Time / Mongolia - { 83, 0, 6794 }, // South Africa Standard Time / AnyCountry - { 14, 20, 6804 }, // Belarus Standard Time / Belarus - { 29, 254, 6817 }, // E. Africa Standard Time / SouthSudan - { 87, 13, 6829 }, // Tasmania Standard Time / Australia - { 99, 178, 6863 }, // Vladivostok Standard Time / Russia - { 104, 8, 6908 }, // West Pacific Standard Time / Antarctica - { 39, 104, 6934 }, // GMT Standard Time / Ireland - { 102, 14, 6948 }, // W. Europe Standard Time / Austria + { 131, 143, 0 }, // W. Mongolia Standard Time / Mongolia + { 124, 112, 10 }, // UTC+12 / Kiribati + { 52, 94, 25 }, // Haiti Standard Time / Haiti + { 32, 44, 48 }, // China Standard Time / China + { 95, 244, 62 }, // SA Western Standard Time / Saint Barthelemy + { 25, 116, 84 }, // Central Asia Standard Time / Kyrgyzstan + { 36, 8, 97 }, // E. Africa Standard Time / Antarctica + { 33, 154, 114 }, // Chatham Islands Standard Time / New Zealand + { 95, 144, 130 }, // SA Western Standard Time / Montserrat + { 37, 13, 149 }, // E. Australia Standard Time / Australia + { 61, 0, 187 }, // Line Islands Standard Time / AnyCountry + { 132, 218, 198 }, // West Asia Standard Time / Turkmenistan + { 122, 30, 212 }, // UTC-02 / Brazil + { 24, 52, 228 }, // Central America Standard Time / Costa Rica + { 36, 67, 247 }, // E. Africa Standard Time / Eritrea + { 128, 8, 261 }, // W. Australia Standard Time / Antarctica + { 101, 101, 278 }, // SE Asia Standard Time / Indonesia + { 93, 8, 306 }, // SA Eastern Standard Time / Antarctica + { 4, 178, 325 }, // Altai Standard Time / Russia + { 95, 256, 338 }, // SA Western Standard Time / Sint Maarten + { 95, 60, 360 }, // SA Western Standard Time / Dominica + { 134, 167, 377 }, // West Pacific Standard Time / Papua New Guinea + { 13, 13, 398 }, // AUS Eastern Standard Time / Australia + { 69, 236, 435 }, // Morocco Standard Time / Western Sahara + { 39, 30, 451 }, // E. South America Standard Time / Brazil + { 124, 134, 469 }, // UTC+12 / Marshall Islands + { 125, 112, 502 }, // UTC+13 / Kiribati + { 103, 146, 520 }, // South Africa Standard Time / Mozambique + { 94, 30, 534 }, // SA Pacific Standard Time / Brazil + { 88, 74, 570 }, // Romance Standard Time / France + { 71, 38, 583 }, // Mountain Standard Time / Canada + { 72, 147, 657 }, // Myanmar Standard Time / Myanmar + { 26, 30, 670 }, // Central Brazilian Standard Time / Brazil + { 130, 123, 706 }, // W. Europe Standard Time / Liechtenstein + { 46, 73, 719 }, // FLE Standard Time / Finland + { 93, 70, 735 }, // SA Eastern Standard Time / Falkland Islands + { 78, 159, 752 }, // Norfolk Standard Time / Norfolk Island + { 53, 0, 768 }, // Hawaiian Standard Time / AnyCountry + { 28, 54, 779 }, // Central European Standard Time / Croatia + { 75, 150, 793 }, // Nepal Standard Time / Nepal + { 46, 33, 807 }, // FLE Standard Time / Bulgaria + { 6, 162, 820 }, // Arabian Standard Time / Oman + { 132, 131, 832 }, // West Asia Standard Time / Maldives + { 88, 197, 848 }, // Romance Standard Time / Spain + { 50, 91, 875 }, // Greenwich Standard Time / Guinea + { 5, 237, 890 }, // Arab Standard Time / Yemen + { 92, 222, 900 }, // Russian Standard Time / Ukraine + { 103, 204, 918 }, // South Africa Standard Time / Swaziland + { 130, 203, 933 }, // W. Europe Standard Time / Svalbard And Jan Mayen Islands + { 7, 103, 953 }, // Arabic Standard Time / Iraq + { 119, 226, 966 }, // UTC-11 / United States Minor Outlying Islands + { 5, 115, 981 }, // Arab Standard Time / Kuwait + { 50, 189, 993 }, // Greenwich Standard Time / Sierra Leone + { 31, 0, 1009 }, // Central Standard Time / AnyCountry + { 53, 51, 1017 }, // Hawaiian Standard Time / Cook Islands + { 129, 50, 1035 }, // W. Central Africa Standard Time / Congo Brazzaville + { 64, 43, 1054 }, // Magallanes Standard Time / Chile + { 119, 0, 1075 }, // UTC-11 / AnyCountry + { 84, 38, 1086 }, // Pacific Standard Time / Canada + { 22, 11, 1138 }, // Caucasus Standard Time / Armenia + { 130, 142, 1151 }, // W. Europe Standard Time / Monaco + { 103, 239, 1165 }, // South Africa Standard Time / Zambia + { 46, 222, 1179 }, // FLE Standard Time / Ukraine + { 87, 168, 1225 }, // Paraguay Standard Time / Paraguay + { 57, 109, 1242 }, // Jordan Standard Time / Jordan + { 109, 30, 1253 }, // Tocantins Standard Time / Brazil + { 55, 102, 1271 }, // Iran Standard Time / Iran + { 101, 8, 1283 }, // SE Asia Standard Time / Antarctica + { 27, 57, 1300 }, // Central Europe Standard Time / Czech Republic + { 95, 215, 1314 }, // SA Western Standard Time / Trinidad And Tobago + { 103, 28, 1336 }, // South Africa Standard Time / Botswana + { 132, 0, 1352 }, // West Asia Standard Time / AnyCountry + { 94, 63, 1362 }, // SA Pacific Standard Time / Ecuador + { 51, 85, 1380 }, // GTB Standard Time / Greece + { 36, 128, 1394 }, // E. Africa Standard Time / Madagascar + { 53, 226, 1414 }, // Hawaiian Standard Time / United States Minor Outlying Islands + { 94, 107, 1431 }, // SA Pacific Standard Time / Jamaica + { 104, 198, 1447 }, // Sri Lanka Standard Time / Sri Lanka + { 27, 243, 1460 }, // Central Europe Standard Time / Serbia + { 25, 110, 1476 }, // Central Asia Standard Time / Kazakhstan + { 125, 0, 1502 }, // UTC+13 / AnyCountry + { 94, 38, 1513 }, // SA Pacific Standard Time / Canada + { 25, 31, 1535 }, // Central Asia Standard Time / British Indian Ocean Territory + { 108, 13, 1549 }, // Tasmania Standard Time / Australia + { 95, 174, 1583 }, // SA Western Standard Time / Puerto Rico + { 95, 180, 1603 }, // SA Western Standard Time / Saint Kitts And Nevis + { 130, 206, 1620 }, // W. Europe Standard Time / Switzerland + { 117, 225, 1634 }, // US Eastern Standard Time / United States + { 29, 140, 1701 }, // Central Pacific Standard Time / Micronesia + { 120, 77, 1731 }, // UTC-09 / French Polynesia + { 129, 156, 1747 }, // W. Central Africa Standard Time / Niger + { 118, 139, 1761 }, // US Mountain Standard Time / Mexico + { 36, 194, 1780 }, // E. Africa Standard Time / Somalia + { 118, 0, 1797 }, // US Mountain Standard Time / AnyCountry + { 10, 24, 1807 }, // Atlantic Standard Time / Bermuda + { 103, 240, 1824 }, // South Africa Standard Time / Zimbabwe + { 32, 126, 1838 }, // China Standard Time / Macau + { 129, 66, 1849 }, // W. Central Africa Standard Time / Equatorial Guinea + { 66, 137, 1863 }, // Mauritius Standard Time / Mauritius + { 46, 68, 1880 }, // FLE Standard Time / Estonia + { 50, 187, 1895 }, // Greenwich Standard Time / Senegal + { 132, 110, 1908 }, // West Asia Standard Time / Kazakhstan + { 25, 44, 1968 }, // Central Asia Standard Time / China + { 130, 106, 1980 }, // W. Europe Standard Time / Italy + { 48, 251, 1992 }, // GMT Standard Time / Isle Of Man + { 36, 210, 2011 }, // E. Africa Standard Time / Tanzania + { 10, 86, 2032 }, // Atlantic Standard Time / Greenland + { 123, 86, 2046 }, // UTC / Greenland + { 20, 38, 2067 }, // Canada Central Standard Time / Canada + { 15, 86, 2104 }, // Azores Standard Time / Greenland + { 69, 145, 2125 }, // Morocco Standard Time / Morocco + { 115, 219, 2143 }, // Turks And Caicos Standard Time / Turks And Caicos Islands + { 50, 80, 2162 }, // Greenwich Standard Time / Gambia + { 129, 42, 2176 }, // W. Central Africa Standard Time / Chad + { 56, 105, 2192 }, // Israel Standard Time / Israel + { 64, 8, 2207 }, // Magallanes Standard Time / Antarctica + { 12, 13, 2225 }, // Aus Central W. Standard Time / Australia + { 24, 155, 2241 }, // Central America Standard Time / Nicaragua + { 102, 170, 2257 }, // Singapore Standard Time / Philippines + { 134, 160, 2269 }, // West Pacific Standard Time / Northern Mariana Islands + { 43, 64, 2284 }, // Egypt Standard Time / Egypt + { 88, 21, 2297 }, // Romance Standard Time / Belgium + { 76, 8, 2313 }, // New Zealand Standard Time / Antarctica + { 51, 177, 2332 }, // GTB Standard Time / Romania + { 103, 0, 2349 }, // South Africa Standard Time / AnyCountry + { 41, 225, 2359 }, // Eastern Standard Time / United States + { 129, 23, 2516 }, // W. Central Africa Standard Time / Benin + { 79, 178, 2534 }, // North Asia East Standard Time / Russia + { 116, 143, 2547 }, // Ulaanbaatar Standard Time / Mongolia + { 130, 14, 2580 }, // W. Europe Standard Time / Austria + { 41, 38, 2594 }, // Eastern Standard Time / Canada + { 95, 255, 2699 }, // SA Western Standard Time / Bonaire + { 124, 149, 2718 }, // UTC+12 / Nauru + { 134, 8, 2732 }, // West Pacific Standard Time / Antarctica + { 63, 178, 2758 }, // Magadan Standard Time / Russia + { 130, 161, 2771 }, // W. Europe Standard Time / Norway + { 110, 0, 2783 }, // Tokyo Standard Time / AnyCountry + { 24, 63, 2793 }, // Central America Standard Time / Ecuador + { 103, 35, 2811 }, // South Africa Standard Time / Burundi + { 10, 38, 2828 }, // Atlantic Standard Time / Canada + { 29, 0, 2896 }, // Central Pacific Standard Time / AnyCountry + { 95, 87, 2907 }, // SA Western Standard Time / Grenada + { 29, 153, 2923 }, // Central Pacific Standard Time / New Caledonia + { 42, 139, 2938 }, // Eastern Standard Time (Mexico) / Mexico + { 2, 225, 2953 }, // Alaskan Standard Time / United States + { 49, 86, 3029 }, // Greenland Standard Time / Greenland + { 50, 92, 3045 }, // Greenwich Standard Time / Guinea Bissau + { 130, 184, 3059 }, // W. Europe Standard Time / San Marino + { 27, 98, 3077 }, // Central Europe Standard Time / Hungary + { 24, 96, 3093 }, // Central America Standard Time / Honduras + { 62, 13, 3113 }, // Lord Howe Standard Time / Australia + { 36, 0, 3133 }, // E. Africa Standard Time / AnyCountry + { 129, 79, 3143 }, // W. Central Africa Standard Time / Gabon + { 95, 182, 3161 }, // SA Western Standard Time / Saint Vincent And The Grenadines + { 48, 224, 3180 }, // GMT Standard Time / United Kingdom + { 68, 227, 3194 }, // Montevideo Standard Time / Uruguay + { 124, 0, 3213 }, // UTC+12 / AnyCountry + { 130, 230, 3224 }, // W. Europe Standard Time / Vatican City State + { 50, 99, 3239 }, // Greenwich Standard Time / Iceland + { 34, 55, 3258 }, // Cuba Standard Time / Cuba + { 41, 16, 3273 }, // Eastern Standard Time / Bahamas + { 122, 196, 3288 }, // UTC-02 / South Georgia And The South Sandwich Islands + { 24, 65, 3311 }, // Central America Standard Time / El Salvador + { 31, 225, 3331 }, // Central Standard Time / United States + { 95, 0, 3499 }, // SA Western Standard Time / AnyCountry + { 94, 166, 3509 }, // SA Pacific Standard Time / Panama + { 94, 47, 3524 }, // SA Pacific Standard Time / Colombia + { 70, 139, 3539 }, // Mountain Standard Time (Mexico) / Mexico + { 124, 220, 3574 }, // UTC+12 / Tuvalu + { 130, 84, 3591 }, // W. Europe Standard Time / Gibraltar + { 82, 178, 3608 }, // Omsk Standard Time / Russia + { 60, 122, 3618 }, // Libya Standard Time / Libya + { 25, 8, 3633 }, // Central Asia Standard Time / Antarctica + { 95, 12, 3651 }, // SA Western Standard Time / Aruba + { 67, 119, 3665 }, // Middle East Standard Time / Lebanon + { 102, 0, 3677 }, // Singapore Standard Time / AnyCountry + { 74, 148, 3687 }, // Namibia Standard Time / Namibia + { 126, 231, 3703 }, // Venezuela Standard Time / Venezuela + { 95, 234, 3719 }, // SA Western Standard Time / United States Virgin Islands + { 21, 0, 3737 }, // Cape Verde Standard Time / AnyCountry + { 95, 9, 3747 }, // SA Western Standard Time / Antigua And Barbuda + { 94, 169, 3763 }, // SA Pacific Standard Time / Peru + { 46, 248, 3776 }, // FLE Standard Time / Aland Islands + { 50, 199, 3793 }, // Greenwich Standard Time / Saint Helena + { 134, 140, 3812 }, // West Pacific Standard Time / Micronesia + { 102, 190, 3825 }, // Singapore Standard Time / Singapore + { 95, 61, 3840 }, // SA Western Standard Time / Dominican Republic + { 103, 129, 3862 }, // South Africa Standard Time / Malawi + { 30, 139, 3878 }, // Central Standard Time (Mexico) / Mexico + { 102, 130, 3954 }, // Singapore Standard Time / Malaysia + { 45, 72, 3985 }, // Fiji Standard Time / Fiji + { 118, 225, 3998 }, // US Mountain Standard Time / United States + { 17, 25, 4014 }, // Bangladesh Standard Time / Bhutan + { 130, 133, 4027 }, // W. Europe Standard Time / Malta + { 92, 178, 4040 }, // Russian Standard Time / Russia + { 95, 135, 4084 }, // SA Western Standard Time / Martinique + { 35, 0, 4103 }, // Dateline Standard Time / AnyCountry + { 135, 178, 4114 }, // Yakutsk Standard Time / Russia + { 1, 1, 4141 }, // Afghanistan Standard Time / Afghanistan + { 123, 0, 4152 }, // UTC / AnyCountry + { 31, 139, 4168 }, // Central Standard Time / Mexico + { 6, 0, 4186 }, // Arabian Standard Time / AnyCountry + { 101, 45, 4196 }, // SE Asia Standard Time / Christmas Island + { 15, 173, 4213 }, // Azores Standard Time / Portugal + { 129, 0, 4229 }, // W. Central Africa Standard Time / AnyCountry + { 17, 18, 4239 }, // Bangladesh Standard Time / Bangladesh + { 31, 38, 4250 }, // Central Standard Time / Canada + { 94, 0, 4325 }, // SA Pacific Standard Time / AnyCountry + { 125, 213, 4335 }, // UTC+13 / Tokelau + { 73, 178, 4351 }, // N. Central Asia Standard Time / Russia + { 133, 165, 4368 }, // West Bank Standard Time / Palestinian Territories + { 114, 217, 4390 }, // Turkey Standard Time / Turkey + { 3, 225, 4406 }, // Aleutian Standard Time / United States + { 101, 0, 4419 }, // SE Asia Standard Time / AnyCountry + { 71, 225, 4429 }, // Mountain Standard Time / United States + { 36, 69, 4458 }, // E. Africa Standard Time / Ethiopia + { 130, 151, 4477 }, // W. Europe Standard Time / Netherlands + { 95, 245, 4494 }, // SA Western Standard Time / Saint Martin + { 48, 173, 4510 }, // GMT Standard Time / Portugal + { 46, 124, 4541 }, // FLE Standard Time / Lithuania + { 130, 82, 4556 }, // W. Europe Standard Time / Germany + { 65, 77, 4586 }, // Marquesas Standard Time / French Polynesia + { 80, 178, 4604 }, // North Asia Standard Time / Russia + { 61, 112, 4639 }, // Line Islands Standard Time / Kiribati + { 96, 200, 4658 }, // Saint Pierre Standard Time / Saint Pierre And Miquelon + { 48, 104, 4675 }, // GMT Standard Time / Ireland + { 5, 186, 4689 }, // Arab Standard Time / Saudi Arabia + { 83, 43, 4701 }, // Pacific SA Standard Time / Chile + { 91, 178, 4718 }, // Russia Time Zone 11 / Russia + { 36, 48, 4745 }, // E. Africa Standard Time / Comoros + { 95, 152, 4759 }, // SA Western Standard Time / Cura Sao + { 38, 141, 4775 }, // E. Europe Standard Time / Moldova + { 24, 22, 4791 }, // Central America Standard Time / Belize + { 103, 195, 4806 }, // South Africa Standard Time / South Africa + { 127, 178, 4826 }, // Vladivostok Standard Time / Russia + { 122, 0, 4857 }, // UTC-02 / AnyCountry + { 106, 207, 4867 }, // Syria Standard Time / Syria + { 93, 76, 4881 }, // SA Eastern Standard Time / French Guiana + { 50, 136, 4897 }, // Greenwich Standard Time / Mauritania + { 41, 0, 4915 }, // Eastern Standard Time / AnyCountry + { 16, 30, 4923 }, // Bahia Standard Time / Brazil + { 40, 43, 4937 }, // Easter Island Standard Time / Chile + { 93, 0, 4952 }, // SA Eastern Standard Time / AnyCountry + { 9, 178, 4962 }, // Astrakhan Standard Time / Russia + { 95, 30, 4996 }, // SA Western Standard Time / Brazil + { 18, 20, 5049 }, // Belarus Standard Time / Belarus + { 95, 181, 5062 }, // SA Western Standard Time / Saint Lucia + { 129, 6, 5079 }, // W. Central Africa Standard Time / Angola + { 129, 157, 5093 }, // W. Central Africa Standard Time / Nigeria + { 130, 5, 5106 }, // W. Europe Standard Time / Andorra + { 58, 178, 5121 }, // Kaliningrad Standard Time / Russia + { 71, 0, 5140 }, // Mountain Standard Time / AnyCountry + { 95, 7, 5148 }, // SA Western Standard Time / Anguilla + { 124, 235, 5165 }, // UTC+12 / Wallis And Futuna Islands + { 6, 223, 5180 }, // Arabian Standard Time / United Arab Emirates + { 94, 40, 5191 }, // SA Pacific Standard Time / Cayman Islands + { 101, 211, 5206 }, // SE Asia Standard Time / Thailand + { 29, 193, 5219 }, // Central Pacific Standard Time / Solomon Islands + { 47, 81, 5239 }, // Georgian Standard Time / Georgia + { 101, 36, 5252 }, // SE Asia Standard Time / Cambodia + { 132, 228, 5268 }, // West Asia Standard Time / Uzbekistan + { 51, 56, 5297 }, // GTB Standard Time / Cyprus + { 95, 88, 5325 }, // SA Western Standard Time / Guadeloupe + { 101, 232, 5344 }, // SE Asia Standard Time / Vietnam + { 113, 178, 5356 }, // Transbaikal Standard Time / Russia + { 50, 121, 5367 }, // Greenwich Standard Time / Liberia + { 95, 233, 5383 }, // SA Western Standard Time / British Virgin Islands + { 129, 49, 5399 }, // W. Central Africa Standard Time / Congo Kinshasa + { 97, 178, 5415 }, // Sakhalin Standard Time / Russia + { 124, 226, 5429 }, // UTC+12 / United States Minor Outlying Islands + { 50, 83, 5442 }, // Greenwich Standard Time / Ghana + { 76, 154, 5455 }, // New Zealand Standard Time / New Zealand + { 23, 13, 5472 }, // Cen. Australia Standard Time / Australia + { 53, 77, 5513 }, // Hawaiian Standard Time / French Polynesia + { 50, 34, 5528 }, // Greenwich Standard Time / Burkina Faso + { 132, 78, 5547 }, // West Asia Standard Time / French Southern Territories + { 121, 0, 5564 }, // UTC-08 / AnyCountry + { 27, 2, 5574 }, // Central Europe Standard Time / Albania + { 107, 208, 5588 }, // Taipei Standard Time / Taiwan + { 88, 58, 5600 }, // Romance Standard Time / Denmark + { 36, 221, 5618 }, // E. Africa Standard Time / Uganda + { 95, 19, 5633 }, // SA Western Standard Time / Barbados + { 14, 15, 5650 }, // Azerbaijan Standard Time / Azerbaijan + { 32, 97, 5660 }, // China Standard Time / Hong Kong + { 110, 101, 5675 }, // Tokyo Standard Time / Indonesia + { 53, 225, 5689 }, // Hawaiian Standard Time / United States + { 36, 111, 5706 }, // E. Africa Standard Time / Kenya + { 134, 89, 5721 }, // West Pacific Standard Time / Guam + { 36, 254, 5734 }, // E. Africa Standard Time / South Sudan + { 48, 71, 5746 }, // GMT Standard Time / Faroe Islands + { 90, 178, 5762 }, // Russia Time Zone 10 / Russia + { 119, 158, 5781 }, // UTC-11 / Niue + { 129, 3, 5794 }, // W. Central Africa Standard Time / Algeria + { 110, 62, 5809 }, // Tokyo Standard Time / East Timor + { 93, 30, 5819 }, // SA Eastern Standard Time / Brazil + { 27, 242, 5898 }, // Central Europe Standard Time / Montenegro + { 129, 37, 5915 }, // W. Central Africa Standard Time / Cameroon + { 101, 117, 5929 }, // SE Asia Standard Time / Laos + { 85, 139, 5944 }, // Pacific Standard Time (Mexico) / Mexico + { 50, 212, 5981 }, // Greenwich Standard Time / Togo + { 46, 118, 5993 }, // FLE Standard Time / Latvia + { 95, 38, 6005 }, // SA Western Standard Time / Canada + { 132, 209, 6026 }, // West Asia Standard Time / Tajikistan + { 77, 38, 6040 }, // Newfoundland Standard Time / Canada + { 110, 108, 6057 }, // Tokyo Standard Time / Japan + { 25, 0, 6068 }, // Central Asia Standard Time / AnyCountry + { 28, 27, 6078 }, // Central European Standard Time / Bosnia And Herzegowina + { 27, 191, 6094 }, // Central Europe Standard Time / Slovakia + { 95, 93, 6112 }, // SA Western Standard Time / Guyana + { 48, 197, 6127 }, // GMT Standard Time / Spain + { 19, 167, 6143 }, // Bougainville Standard Time / Papua New Guinea + { 5, 17, 6164 }, // Arab Standard Time / Bahrain + { 24, 90, 6177 }, // Central America Standard Time / Guatemala + { 95, 26, 6195 }, // SA Western Standard Time / Bolivia + { 81, 113, 6210 }, // North Korea Standard Time / North Korea + { 119, 4, 6225 }, // UTC-11 / American Samoa + { 66, 176, 6243 }, // Mauritius Standard Time / Reunion + { 103, 120, 6258 }, // South Africa Standard Time / Lesotho + { 84, 0, 6272 }, // Pacific Standard Time / AnyCountry + { 120, 0, 6280 }, // UTC-09 / AnyCountry + { 129, 216, 6290 }, // W. Central Africa Standard Time / Tunisia + { 99, 185, 6303 }, // Sao Tome Standard Time / Sao Tome And Principe + { 100, 178, 6319 }, // Saratov Standard Time / Russia + { 105, 201, 6334 }, // Sudan Standard Time / Sudan + { 48, 252, 6350 }, // GMT Standard Time / Jersey + { 29, 13, 6364 }, // Central Pacific Standard Time / Australia + { 71, 139, 6385 }, // Mountain Standard Time / Mexico + { 21, 39, 6401 }, // Cape Verde Standard Time / Cape Verde + { 102, 101, 6421 }, // Singapore Standard Time / Indonesia + { 27, 192, 6435 }, // Central Europe Standard Time / Slovenia + { 48, 75, 6452 }, // GMT Standard Time / Guernsey + { 132, 8, 6468 }, // West Asia Standard Time / Antarctica + { 8, 10, 6486 }, // Argentina Standard Time / Argentina + { 98, 183, 6759 }, // Samoa Standard Time / Samoa + { 129, 41, 6772 }, // W. Central Africa Standard Time / Central African Republic + { 111, 178, 6786 }, // Tomsk Standard Time / Russia + { 110, 164, 6797 }, // Tokyo Standard Time / Palau + { 11, 13, 6811 }, // AUS Central Standard Time / Australia + { 121, 171, 6828 }, // UTC-08 / Pitcairn + { 102, 32, 6845 }, // Singapore Standard Time / Brunei + { 112, 214, 6857 }, // Tonga Standard Time / Tonga + { 89, 178, 6875 }, // Russia Time Zone 3 / Russia + { 128, 13, 6889 }, // W. Australia Standard Time / Australia + { 28, 172, 6905 }, // Central European Standard Time / Poland + { 72, 46, 6919 }, // Myanmar Standard Time / Cocos Islands + { 66, 188, 6932 }, // Mauritius Standard Time / Seychelles + { 84, 225, 6944 }, // Pacific Standard Time / United States + { 54, 100, 6983 }, // India Standard Time / India + { 50, 53, 6997 }, // Greenwich Standard Time / Ivory Coast + { 24, 0, 7012 }, // Central America Standard Time / AnyCountry + { 29, 229, 7022 }, // Central Pacific Standard Time / Vanuatu + { 130, 125, 7036 }, // W. Europe Standard Time / Luxembourg + { 50, 132, 7054 }, // Greenwich Standard Time / Mali + { 103, 179, 7068 }, // South Africa Standard Time / Rwanda + { 5, 175, 7082 }, // Arab Standard Time / Qatar + { 86, 163, 7093 }, // Pakistan Standard Time / Pakistan + { 134, 0, 7106 }, // West Pacific Standard Time / AnyCountry + { 36, 59, 7117 }, // E. Africa Standard Time / Djibouti + { 44, 178, 7133 }, // Ekaterinburg Standard Time / Russia + { 118, 38, 7152 }, // US Mountain Standard Time / Canada + { 36, 138, 7209 }, // E. Africa Standard Time / Mayotte + { 28, 127, 7224 }, // Central European Standard Time / Macedonia + { 59, 114, 7238 }, // Korea Standard Time / South Korea + { 93, 202, 7249 }, // SA Eastern Standard Time / Suriname + { 130, 205, 7268 }, // W. Europe Standard Time / Sweden + { 103, 49, 7285 }, // South Africa Standard Time / Congo Kinshasa { 0, 0, 0 } // Trailing zeroes }; // Windows ID Key, Windows ID Index, IANA ID Index, UTC Offset static const QWindowsData windowsDataTable[] = { - { 1, 0, 3480, 16200 }, // Afghanistan Standard Time - { 2, 26, 6962,-32400 }, // Alaskan Standard Time - { 3, 48, 5629, 10800 }, // Arab Standard Time - { 4, 67, 3254, 14400 }, // Arabian Standard Time - { 5, 89, 504, 10800 }, // Arabic Standard Time - { 6, 110, 6980,-10800 }, // Argentina Standard Time - { 7, 134, 7001,-14400 }, // Atlantic Standard Time - { 8, 157, 4368, 34200 }, // AUS Central Standard Time - { 9, 183, 7017, 36000 }, // AUS Eastern Standard Time - { 10, 209, 4400, 14400 }, // Azerbaijan Standard Time - { 11, 234, 1220, -3600 }, // Azores Standard Time - { 12, 255, 701,-10800 }, // Bahia Standard Time - { 13, 275, 1340, 21600 }, // Bangladesh Standard Time - { 14, 300, 6804, 10800 }, // Belarus Standard Time - { 15, 322, 7034,-21600 }, // Canada Central Standard Time - { 16, 351, 4348, -3600 }, // Cape Verde Standard Time - { 17, 376, 3902, 14400 }, // Caucasus Standard Time - { 18, 399, 7049, 34200 }, // Cen. Australia Standard Time - { 19, 428, 4058,-21600 }, // Central America Standard Time - { 20, 458, 7068, 21600 }, // Central Asia Standard Time - { 21, 485, 7080,-14400 }, // Central Brazilian Standard Time - { 22, 517, 5078, 3600 }, // Central Europe Standard Time - { 23, 546, 3970, 3600 }, // Central European Standard Time - { 24, 577, 1769, 39600 }, // Central Pacific Standard Time - { 25, 607, 7095,-21600 }, // Central Standard Time (Mexico) - { 26, 638, 7115,-21600 }, // Central Standard Time - { 27, 660, 6078, 28800 }, // China Standard Time - { 28, 680, 3352,-43200 }, // Dateline Standard Time - { 29, 703, 2585, 10800 }, // E. Africa Standard Time - { 30, 727, 7131, 36000 }, // E. Australia Standard Time - { 31, 754, 2654,-10800 }, // E. South America Standard Time - { 32, 785, 7150,-18000 }, // Eastern Standard Time - { 33, 807, 2031,-18000 }, // Eastern Standard Time (Mexico) - { 34, 838, 1678, 7200 }, // Egypt Standard Time - { 35, 858, 651, 18000 }, // Ekaterinburg Standard Time - { 36, 885, 6369, 43200 }, // Fiji Standard Time - { 37, 904, 7167, 7200 }, // FLE Standard Time - { 38, 922, 3022, 14400 }, // Georgian Standard Time - { 39, 945, 5683, 0 }, // GMT Standard Time - { 40, 963, 3954,-10800 }, // Greenland Standard Time - { 41, 987, 2012, 0 }, // Greenwich Standard Time - { 42, 1011, 1819, 7200 }, // GTB Standard Time - { 43, 1029, 3335,-36000 }, // Hawaiian Standard Time - { 44, 1052, 4520, 19800 }, // India Standard Time - { 45, 1072, 1328, 12600 }, // Iran Standard Time - { 46, 1091, 4427, 7200 }, // Israel Standard Time - { 47, 1112, 1808, 7200 }, // Jordan Standard Time - { 48, 1133, 1789, 7200 }, // Kaliningrad Standard Time - { 49, 1159, 3723, 32400 }, // Korea Standard Time - { 50, 1179, 63, 7200 }, // Libya Standard Time - { 51, 1199, 835, 50400 }, // Line Islands Standard Time - { 52, 1226, 2274, 36000 }, // Magadan Standard Time - { 53, 1248, 6744, 14400 }, // Mauritius Standard Time - { 54, 1272, 4046, 7200 }, // Middle East Standard Time - { 55, 1298, 755,-10800 }, // Montevideo Standard Time - { 56, 1323, 3884, 0 }, // Morocco Standard Time - { 57, 1345, 7179,-25200 }, // Mountain Standard Time (Mexico) - { 58, 1377, 7197,-25200 }, // Mountain Standard Time - { 59, 1400, 1725, 23400 }, // Myanmar Standard Time - { 60, 1422, 7212, 21600 }, // N. Central Asia Standard Time - { 61, 1452, 5094, 3600 }, // Namibia Standard Time - { 62, 1474, 4506, 20700 }, // Nepal Standard Time - { 63, 1494, 3399, 43200 }, // New Zealand Standard Time - { 64, 1520, 3382,-12600 }, // Newfoundland Standard Time - { 65, 1547, 1405, 28800 }, // North Asia East Standard Time - { 66, 1577, 7229, 25200 }, // North Asia Standard Time - { 67, 1602, 6235,-10800 }, // Pacific SA Standard Time - { 68, 1627, 819, 7200 }, // E. Europe Standard Time - { 69, 1651, 1351,-28800 }, // Pacific Standard Time - { 70, 1673, 4076, 18000 }, // Pakistan Standard Time - { 71, 1696, 3088,-14400 }, // Paraguay Standard Time - { 72, 1719, 638, 3600 }, // Romance Standard Time - { 73, 1741, 3815, 14400 }, // Russia Time Zone 3 - { 74, 1760, 533, 39600 }, // Russia Time Zone 10 - { 75, 1780, 7246, 43200 }, // Russia Time Zone 11 - { 76, 1800, 7261, 10800 }, // Russian Standard Time - { 77, 1822, 149,-10800 }, // SA Eastern Standard Time - { 78, 1847, 4333,-18000 }, // SA Pacific Standard Time - { 79, 1872, 4122,-14400 }, // SA Western Standard Time - { 80, 1897, 3322, 46800 }, // Samoa Standard Time - { 81, 1917, 2320, 25200 }, // SE Asia Standard Time - { 82, 1939, 3465, 28800 }, // Singapore Standard Time - { 83, 1963, 3148, 7200 }, // South Africa Standard Time - { 84, 1990, 5764, 19800 }, // Sri Lanka Standard Time - { 85, 2014, 4294, 7200 }, // Syria Standard Time - { 86, 2034, 3932, 28800 }, // Taipei Standard Time - { 87, 2055, 7275, 36000 }, // Tasmania Standard Time - { 88, 2078, 5654, 32400 }, // Tokyo Standard Time - { 89, 2098, 3984, 46800 }, // Tonga Standard Time - { 90, 2118, 4784, 7200 }, // Turkey Standard Time - { 91, 2139, 7292, 28800 }, // Ulaanbaatar Standard Time - { 92, 2165, 7309,-18000 }, // US Eastern Standard Time - { 93, 2190, 4894,-25200 }, // US Mountain Standard Time - { 94, 2216, 3753, -7200 }, // UTC-02 - { 95, 2223, 3035,-39600 }, // UTC-11 - { 96, 2230, 1070, 0 }, // UTC - { 97, 2234, 239, 43200 }, // UTC+12 - { 98, 2241, 5172,-16200 }, // Venezuela Standard Time - { 99, 2265, 7330, 36000 }, // Vladivostok Standard Time - { 100, 2291, 3843, 28800 }, // W. Australia Standard Time - { 101, 2318, 1909, 3600 }, // W. Central Africa Standard Time - { 102, 2350, 7347, 3600 }, // W. Europe Standard Time - { 103, 2374, 7361, 18000 }, // West Asia Standard Time - { 104, 2398, 3067, 36000 }, // West Pacific Standard Time - { 105, 2425, 7375, 32400 }, // Yakutsk Standard Time - { 106, 2447, 4385, 30600 }, // North Korea Standard Time + { 1, 0, 4141, 16200 }, // Afghanistan Standard Time + { 2, 26, 7303,-32400 }, // Alaskan Standard Time + { 3, 48, 4406,-36000 }, // Aleutian Standard Time + { 4, 71, 325, 25200 }, // Altai Standard Time + { 5, 91, 4689, 10800 }, // Arab Standard Time + { 6, 110, 5180, 14400 }, // Arabian Standard Time + { 7, 132, 953, 10800 }, // Arabic Standard Time + { 8, 153, 7321,-10800 }, // Argentina Standard Time + { 9, 177, 7342, 14400 }, // Astrakhan Standard Time + { 10, 201, 7359,-14400 }, // Atlantic Standard Time + { 11, 224, 6811, 34200 }, // AUS Central Standard Time + { 12, 250, 2225, 31500 }, // Aus Central W. Standard Time + { 13, 279, 7375, 36000 }, // AUS Eastern Standard Time + { 14, 305, 5650, 14400 }, // Azerbaijan Standard Time + { 15, 330, 4213, -3600 }, // Azores Standard Time + { 16, 351, 4923,-10800 }, // Bahia Standard Time + { 17, 371, 4239, 21600 }, // Bangladesh Standard Time + { 18, 396, 5049, 10800 }, // Belarus Standard Time + { 19, 418, 6143, 39600 }, // Bougainville Standard Time + { 20, 445, 7392,-21600 }, // Canada Central Standard Time + { 21, 474, 6401, -3600 }, // Cape Verde Standard Time + { 22, 499, 1138, 14400 }, // Caucasus Standard Time + { 23, 522, 7407, 34200 }, // Cen. Australia Standard Time + { 24, 551, 6177,-21600 }, // Central America Standard Time + { 25, 581, 7426, 21600 }, // Central Asia Standard Time + { 26, 608, 7438,-14400 }, // Central Brazilian Standard Time + { 27, 640, 3077, 3600 }, // Central Europe Standard Time + { 28, 669, 6905, 3600 }, // Central European Standard Time + { 29, 700, 5219, 39600 }, // Central Pacific Standard Time + { 30, 730, 7453,-21600 }, // Central Standard Time (Mexico) + { 31, 761, 7473,-21600 }, // Central Standard Time + { 32, 783, 48, 28800 }, // China Standard Time + { 33, 803, 114, 45900 }, // Chatham Islands Standard Time + { 34, 833, 3258,-18000 }, // Cuba Standard Time + { 35, 852, 4103,-43200 }, // Dateline Standard Time + { 36, 875, 5706, 10800 }, // E. Africa Standard Time + { 37, 899, 7489, 36000 }, // E. Australia Standard Time + { 38, 926, 4775, 7200 }, // E. Europe Standard Time + { 39, 950, 451,-10800 }, // E. South America Standard Time + { 40, 981, 4937,-21600 }, // Easter Island Standard Time + { 41, 1009, 7508,-18000 }, // Eastern Standard Time + { 42, 1031, 2938,-18000 }, // Eastern Standard Time (Mexico) + { 43, 1062, 2284, 7200 }, // Egypt Standard Time + { 44, 1082, 7133, 18000 }, // Ekaterinburg Standard Time + { 45, 1109, 3985, 43200 }, // Fiji Standard Time + { 46, 1128, 7525, 7200 }, // FLE Standard Time + { 47, 1146, 5239, 14400 }, // Georgian Standard Time + { 48, 1169, 3180, 0 }, // GMT Standard Time + { 49, 1187, 3029,-10800 }, // Greenland Standard Time + { 50, 1211, 3239, 0 }, // Greenwich Standard Time + { 51, 1235, 2332, 7200 }, // GTB Standard Time + { 52, 1253, 25,-18000 }, // Haiti Standard Time + { 53, 1273, 5689,-36000 }, // Hawaiian Standard Time + { 54, 1296, 6983, 19800 }, // India Standard Time + { 55, 1316, 1271, 12600 }, // Iran Standard Time + { 56, 1335, 2192, 7200 }, // Israel Standard Time + { 57, 1356, 1242, 7200 }, // Jordan Standard Time + { 58, 1377, 5121, 7200 }, // Kaliningrad Standard Time + { 59, 1403, 7238, 32400 }, // Korea Standard Time + { 60, 1423, 3618, 7200 }, // Libya Standard Time + { 61, 1443, 4639, 50400 }, // Line Islands Standard Time + { 62, 1470, 3113, 37800 }, // Lord Howe Standard Time + { 63, 1494, 2758, 36000 }, // Magadan Standard Time + { 64, 1516, 1054,-10800 }, // Magallanes Standard Time + { 65, 1541, 4586,-34200 }, // Marquesas Standard Time + { 66, 1565, 1863, 14400 }, // Mauritius Standard Time + { 67, 1589, 3665, 7200 }, // Middle East Standard Time + { 68, 1615, 3194,-10800 }, // Montevideo Standard Time + { 69, 1640, 2125, 0 }, // Morocco Standard Time + { 70, 1662, 7537,-25200 }, // Mountain Standard Time (Mexico) + { 71, 1694, 7555,-25200 }, // Mountain Standard Time + { 72, 1717, 657, 23400 }, // Myanmar Standard Time + { 73, 1739, 4351, 21600 }, // N. Central Asia Standard Time + { 74, 1769, 3687, 3600 }, // Namibia Standard Time + { 75, 1791, 793, 20700 }, // Nepal Standard Time + { 76, 1811, 5455, 43200 }, // New Zealand Standard Time + { 77, 1837, 6040,-12600 }, // Newfoundland Standard Time + { 78, 1864, 752, 39600 }, // Norfolk Standard Time + { 79, 1886, 2534, 28800 }, // North Asia East Standard Time + { 80, 1916, 7570, 25200 }, // North Asia Standard Time + { 81, 1941, 6210, 30600 }, // North Korea Standard Time + { 82, 1967, 3608, 21600 }, // Omsk Standard Time + { 83, 1986, 4701,-10800 }, // Pacific SA Standard Time + { 84, 2011, 7587,-28800 }, // Pacific Standard Time + { 85, 2033, 7607,-28800 }, // Pacific Standard Time (Mexico) + { 86, 2064, 7093, 18000 }, // Pakistan Standard Time + { 87, 2087, 1225,-14400 }, // Paraguay Standard Time + { 88, 2110, 570, 3600 }, // Romance Standard Time + { 89, 2132, 6875, 14400 }, // Russia Time Zone 3 + { 90, 2151, 5762, 39600 }, // Russia Time Zone 10 + { 91, 2171, 7623, 43200 }, // Russia Time Zone 11 + { 92, 2191, 7638, 10800 }, // Russian Standard Time + { 93, 2213, 4881,-10800 }, // SA Eastern Standard Time + { 94, 2238, 3524,-18000 }, // SA Pacific Standard Time + { 95, 2263, 6195,-14400 }, // SA Western Standard Time + { 96, 2288, 4658,-10800 }, // Saint Pierre Standard Time + { 97, 2315, 5415, 39600 }, // Sakhalin Standard Time + { 98, 2338, 6759, 46800 }, // Samoa Standard Time + { 99, 2358, 6303, 0 }, // Sao Tome Standard Time + { 100, 2381, 6319, 14400 }, // Saratov Standard Time + { 101, 2403, 5206, 25200 }, // SE Asia Standard Time + { 102, 2425, 3825, 28800 }, // Singapore Standard Time + { 103, 2449, 4806, 7200 }, // South Africa Standard Time + { 104, 2476, 1447, 19800 }, // Sri Lanka Standard Time + { 105, 2500, 6334, 7200 }, // Sudan Standard Time + { 106, 2520, 4867, 7200 }, // Syria Standard Time + { 107, 2540, 5588, 28800 }, // Taipei Standard Time + { 108, 2561, 7652, 36000 }, // Tasmania Standard Time + { 109, 2584, 1253,-10800 }, // Tocantins Standard Time + { 110, 2608, 6057, 32400 }, // Tokyo Standard Time + { 111, 2628, 6786, 25200 }, // Tomsk Standard Time + { 112, 2648, 6857, 46800 }, // Tonga Standard Time + { 113, 2668, 5356, 32400 }, // Transbaikal Standard Time + { 114, 2694, 4390, 7200 }, // Turkey Standard Time + { 115, 2715, 2143,-14400 }, // Turks And Caicos Standard Time + { 116, 2746, 7669, 28800 }, // Ulaanbaatar Standard Time + { 117, 2772, 7686,-18000 }, // US Eastern Standard Time + { 118, 2797, 3998,-25200 }, // US Mountain Standard Time + { 119, 2823, 1075,-39600 }, // UTC-11 + { 120, 2830, 6280,-32400 }, // UTC-09 + { 121, 2837, 5564,-28800 }, // UTC-08 + { 122, 2844, 4857, -7200 }, // UTC-02 + { 123, 2851, 7707, 0 }, // UTC + { 124, 2855, 3213, 43200 }, // UTC+12 + { 125, 2862, 1502, 46800 }, // UTC+13 + { 126, 2869, 3703,-16200 }, // Venezuela Standard Time + { 127, 2893, 7715, 36000 }, // Vladivostok Standard Time + { 128, 2919, 6889, 28800 }, // W. Australia Standard Time + { 129, 2946, 5093, 3600 }, // W. Central Africa Standard Time + { 130, 2978, 7732, 3600 }, // W. Europe Standard Time + { 131, 3002, 0, 25200 }, // W. Mongolia Standard Time + { 132, 3028, 7746, 18000 }, // West Asia Standard Time + { 133, 3052, 7760, 7200 }, // West Bank Standard Time + { 134, 3076, 377, 36000 }, // West Pacific Standard Time + { 135, 3103, 7772, 32400 }, // Yakutsk Standard Time { 0, 0, 0, 0 } // Trailing zeroes }; // IANA ID Index, UTC Offset static const QUtcData utcDataTable[] = { - { 7388, 0 }, // UTC - { 7392,-50400 }, // UTC-14:00 - { 7402,-46800 }, // UTC-13:00 - { 7412,-43200 }, // UTC-12:00 - { 7422,-39600 }, // UTC-11:00 - { 7432,-36000 }, // UTC-10:00 - { 7442,-32400 }, // UTC-09:00 - { 7452,-28800 }, // UTC-08:00 - { 7462,-25200 }, // UTC-07:00 - { 7472,-21600 }, // UTC-06:00 - { 7482,-18000 }, // UTC-05:00 - { 7492,-16200 }, // UTC-04:30 - { 7502,-14400 }, // UTC-04:00 - { 7512,-12600 }, // UTC-03:30 - { 7522,-10800 }, // UTC-03:00 - { 7532, -7200 }, // UTC-02:00 - { 7542, -3600 }, // UTC-01:00 - { 7552, 0 }, // UTC-00:00 - { 7562, 0 }, // UTC+00:00 - { 7572, 3600 }, // UTC+01:00 - { 7582, 7200 }, // UTC+02:00 - { 7592, 10800 }, // UTC+03:00 - { 7602, 12600 }, // UTC+03:30 - { 7612, 14400 }, // UTC+04:00 - { 7622, 16200 }, // UTC+04:30 - { 7632, 18000 }, // UTC+05:00 - { 7642, 19800 }, // UTC+05:30 - { 7652, 20700 }, // UTC+05:45 - { 7662, 21600 }, // UTC+06:00 - { 7672, 23400 }, // UTC+06:30 - { 7682, 25200 }, // UTC+07:00 - { 7692, 28800 }, // UTC+08:00 - { 7702, 32400 }, // UTC+09:00 - { 7712, 34200 }, // UTC+09:30 - { 7722, 36000 }, // UTC+10:00 - { 7732, 39600 }, // UTC+11:00 - { 7742, 43200 }, // UTC+12:00 - { 7752, 46800 }, // UTC+13:00 - { 7762, 50400 }, // UTC+14:00 - { 7772, 30600 }, // UTC+08:30 + { 7785, 0 }, // UTC + { 7789,-50400 }, // UTC-14:00 + { 7799,-46800 }, // UTC-13:00 + { 7809,-43200 }, // UTC-12:00 + { 7819,-39600 }, // UTC-11:00 + { 7829,-36000 }, // UTC-10:00 + { 7839,-32400 }, // UTC-09:00 + { 7849,-28800 }, // UTC-08:00 + { 7859,-25200 }, // UTC-07:00 + { 7869,-21600 }, // UTC-06:00 + { 7879,-18000 }, // UTC-05:00 + { 7889,-16200 }, // UTC-04:30 + { 7899,-14400 }, // UTC-04:00 + { 7909,-12600 }, // UTC-03:30 + { 7919,-10800 }, // UTC-03:00 + { 7929, -7200 }, // UTC-02:00 + { 7939, -3600 }, // UTC-01:00 + { 7949, 0 }, // UTC-00:00 + { 7959, 0 }, // UTC+00:00 + { 7969, 3600 }, // UTC+01:00 + { 7979, 7200 }, // UTC+02:00 + { 7989, 10800 }, // UTC+03:00 + { 7999, 12600 }, // UTC+03:30 + { 8009, 14400 }, // UTC+04:00 + { 8019, 16200 }, // UTC+04:30 + { 8029, 18000 }, // UTC+05:00 + { 8039, 19800 }, // UTC+05:30 + { 8049, 20700 }, // UTC+05:45 + { 8059, 21600 }, // UTC+06:00 + { 8069, 23400 }, // UTC+06:30 + { 8079, 25200 }, // UTC+07:00 + { 8089, 28800 }, // UTC+08:00 + { 8099, 30600 }, // UTC+08:30 + { 8109, 32400 }, // UTC+09:00 + { 8119, 34200 }, // UTC+09:30 + { 8129, 36000 }, // UTC+10:00 + { 8139, 39600 }, // UTC+11:00 + { 8149, 43200 }, // UTC+12:00 + { 8159, 46800 }, // UTC+13:00 + { 8169, 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, -0x42, 0x65, 0x6c, 0x61, 0x72, 0x75, 0x73, 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, 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, 0x61, 0x73, 0x74, 0x65, 0x72, 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, 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, 0x4c, -0x69, 0x62, 0x79, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4c, -0x69, 0x6e, 0x65, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 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, 0x45, 0x2e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x20, 0x53, 0x74, 0x61, +0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x6c, 0x65, 0x75, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, +0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x6c, 0x74, 0x61, 0x69, 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, 0x73, 0x74, +0x72, 0x61, 0x6b, 0x68, 0x61, 0x6e, 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, 0x75, 0x73, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, +0x6c, 0x20, 0x57, 0x2e, 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, 0x42, 0x65, 0x6c, 0x61, +0x72, 0x75, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x42, 0x6f, +0x75, 0x67, 0x61, 0x69, 0x6e, 0x76, 0x69, 0x6c, 0x6c, 0x65, 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, 0x43, 0x68, 0x61, 0x74, 0x68, 0x61, 0x6d, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x53, +0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x75, 0x62, 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, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 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, 0x61, 0x73, 0x74, 0x65, 0x72, 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, 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, 0x69, 0x74, 0x69, 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, 0x4c, 0x69, 0x62, 0x79, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, +0x6d, 0x65, 0x0, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, +0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4c, 0x6f, 0x72, 0x64, 0x20, 0x48, 0x6f, 0x77, 0x65, 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, 0x67, 0x61, +0x6c, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, +0x0, 0x4d, 0x61, 0x72, 0x71, 0x75, 0x65, 0x73, 0x61, 0x73, 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, 0x66, 0x6f, 0x6c, 0x6b, 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, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x4b, 0x6f, 0x72, 0x65, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, +0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4f, 0x6d, 0x73, 0x6b, 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, 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, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x5a, 0x6f, 0x6e, 0x65, 0x20, 0x33, 0x0, -0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x5a, 0x6f, 0x6e, 0x65, 0x20, 0x31, 0x30, 0x0, -0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x5a, 0x6f, 0x6e, 0x65, 0x20, 0x31, 0x31, 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, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x4b, 0x6f, 0x72, 0x65, 0x61, 0x20, 0x53, -0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0 +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, 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, 0x20, 0x54, +0x69, 0x6d, 0x65, 0x20, 0x5a, 0x6f, 0x6e, 0x65, 0x20, 0x33, 0x0, 0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x20, 0x54, 0x69, +0x6d, 0x65, 0x20, 0x5a, 0x6f, 0x6e, 0x65, 0x20, 0x31, 0x30, 0x0, 0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x20, 0x54, 0x69, +0x6d, 0x65, 0x20, 0x5a, 0x6f, 0x6e, 0x65, 0x20, 0x31, 0x31, 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, 0x69, 0x6e, 0x74, 0x20, 0x50, 0x69, 0x65, 0x72, 0x72, 0x65, +0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x61, 0x6b, 0x68, 0x61, +0x6c, 0x69, 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, 0x61, +0x6f, 0x20, 0x54, 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, +0x0, 0x53, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x76, 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, 0x75, 0x64, 0x61, 0x6e, 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, 0x63, 0x61, 0x6e, 0x74, 0x69, 0x6e, 0x73, 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, 0x6d, 0x73, 0x6b, 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, 0x72, 0x61, 0x6e, 0x73, 0x62, 0x61, 0x69, 0x6b, 0x61, 0x6c, 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, 0x54, 0x75, 0x72, 0x6b, 0x73, +0x20, 0x41, 0x6e, 0x64, 0x20, 0x43, 0x61, 0x69, 0x63, 0x6f, 0x73, 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, 0x31, 0x31, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x39, 0x0, 0x55, 0x54, 0x43, +0x2d, 0x30, 0x38, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x32, 0x0, 0x55, 0x54, 0x43, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, +0x32, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x33, 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, 0x2e, 0x20, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x61, 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, 0x42, 0x61, 0x6e, +0x6b, 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 ianaIdData[] = { +0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x76, 0x64, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x61, +0x72, 0x61, 0x77, 0x61, 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, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x68, 0x61, 0x6e, 0x67, 0x68, 0x61, +0x69, 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, 0x42, 0x69, 0x73, 0x68, 0x6b, 0x65, 0x6b, 0x0, 0x41, 0x6e, 0x74, +0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x79, 0x6f, 0x77, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, +0x63, 0x2f, 0x43, 0x68, 0x61, 0x74, 0x68, 0x61, 0x6d, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, +0x6e, 0x74, 0x73, 0x65, 0x72, 0x72, 0x61, 0x74, 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, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x34, 0x0, 0x41, 0x73, +0x69, 0x61, 0x2f, 0x41, 0x73, 0x68, 0x67, 0x61, 0x62, 0x61, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x4e, 0x6f, 0x72, 0x6f, 0x6e, 0x68, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x73, 0x74, +0x61, 0x5f, 0x52, 0x69, 0x63, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x73, 0x6d, 0x65, 0x72, 0x61, +0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x73, 0x65, 0x79, 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, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x6f, 0x74, +0x68, 0x65, 0x72, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x72, 0x6e, 0x61, 0x75, 0x6c, 0x0, 0x41, 0x6d, +0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x0, +0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x0, 0x50, 0x61, 0x63, +0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f, 0x4d, 0x6f, 0x72, 0x65, 0x73, 0x62, 0x79, 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, 0x41, 0x66, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x45, 0x6c, 0x5f, 0x41, 0x61, 0x69, 0x75, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, +0x61, 0x6f, 0x5f, 0x50, 0x61, 0x75, 0x6c, 0x6f, 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, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x6e, 0x64, 0x65, 0x72, 0x62, 0x75, 0x72, 0x79, 0x0, +0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x70, 0x75, 0x74, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x52, 0x69, 0x6f, 0x5f, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x45, 0x69, 0x72, 0x75, 0x6e, 0x65, 0x70, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x61, 0x72, +0x69, 0x73, 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, 0x73, 0x69, +0x61, 0x2f, 0x52, 0x61, 0x6e, 0x67, 0x6f, 0x6f, 0x6e, 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, 0x56, 0x61, 0x64, 0x75, 0x7a, 0x0, 0x45, +0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x48, 0x65, 0x6c, 0x73, 0x69, 0x6e, 0x6b, 0x69, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, +0x74, 0x69, 0x63, 0x2f, 0x53, 0x74, 0x61, 0x6e, 0x6c, 0x65, 0x79, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, +0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c, 0x6b, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x30, 0x0, 0x45, +0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x61, 0x67, 0x72, 0x65, 0x62, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, +0x74, 0x6d, 0x61, 0x6e, 0x64, 0x75, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6f, 0x66, 0x69, 0x61, 0x0, +0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x75, 0x73, 0x63, 0x61, 0x74, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, +0x61, 0x6c, 0x64, 0x69, 0x76, 0x65, 0x73, 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, 0x66, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x43, 0x6f, 0x6e, 0x61, 0x6b, 0x72, 0x79, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x64, 0x65, 0x6e, 0x0, +0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x69, 0x6d, 0x66, 0x65, 0x72, 0x6f, 0x70, 0x6f, 0x6c, 0x0, 0x41, 0x66, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x62, 0x61, 0x62, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x72, 0x63, 0x74, 0x69, 0x63, 0x2f, +0x4c, 0x6f, 0x6e, 0x67, 0x79, 0x65, 0x61, 0x72, 0x62, 0x79, 0x65, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, +0x67, 0x68, 0x64, 0x61, 0x64, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x69, 0x64, 0x77, 0x61, 0x79, +0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x77, 0x61, 0x69, 0x74, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x46, 0x72, 0x65, 0x65, 0x74, 0x6f, 0x77, 0x6e, 0x0, 0x43, 0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x0, 0x50, 0x61, 0x63, +0x69, 0x66, 0x69, 0x63, 0x2f, 0x52, 0x61, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x42, 0x72, 0x61, 0x7a, 0x7a, 0x61, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x50, 0x75, 0x6e, 0x74, 0x61, 0x5f, 0x41, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, +0x4d, 0x54, 0x2b, 0x31, 0x31, 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, 0x41, 0x73, +0x69, 0x61, 0x2f, 0x59, 0x65, 0x72, 0x65, 0x76, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, +0x6e, 0x61, 0x63, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x73, 0x61, 0x6b, 0x61, 0x0, 0x45, +0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x69, 0x65, 0x76, 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, 0x41, 0x73, 0x75, 0x6e, 0x63, 0x69, 0x6f, +0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6d, 0x6d, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x41, 0x72, 0x61, 0x67, 0x75, 0x61, 0x69, 0x6e, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x65, 0x68, 0x72, +0x61, 0x6e, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x76, 0x69, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x72, 0x61, 0x67, 0x75, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x54, 0x69, 0x6a, 0x75, 0x61, 0x6e, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, -0x6e, 0x74, 0x61, 0x5f, 0x49, 0x73, 0x61, 0x62, 0x65, 0x6c, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, -0x68, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x72, 0x69, 0x70, 0x6f, 0x6c, 0x69, 0x0, 0x41, 0x6d, -0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6c, 0x61, 0x6e, 0x63, 0x2d, 0x53, 0x61, 0x62, 0x6c, 0x6f, 0x6e, 0x0, 0x41, -0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, 0x6a, 0x75, 0x6d, 0x62, 0x75, 0x72, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, -0x70, 0x65, 0x2f, 0x53, 0x74, 0x6f, 0x63, 0x6b, 0x68, 0x6f, 0x6c, 0x6d, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, -0x2f, 0x46, 0x61, 0x6b, 0x61, 0x6f, 0x66, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x79, -0x65, 0x6e, 0x6e, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x66, -0x5f, 0x53, 0x70, 0x61, 0x69, 0x6e, 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, 0x45, -0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x32, 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, 0x4d, 0x61, 0x6b, 0x61, 0x73, -0x73, 0x61, 0x72, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x72, 0x69, 0x65, 0x68, 0x61, 0x6d, 0x6e, -0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46, -0x75, 0x6e, 0x61, 0x66, 0x75, 0x74, 0x69, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x56, -0x69, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x67, 0x61, 0x6c, 0x69, -0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x6f, 0x75, 0x72, 0x67, 0x0, 0x41, -0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4f, 0x75, 0x61, 0x67, 0x61, 0x64, 0x6f, 0x75, 0x67, 0x6f, 0x75, 0x0, 0x41, 0x73, -0x69, 0x61, 0x2f, 0x42, 0x69, 0x73, 0x68, 0x6b, 0x65, 0x6b, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x75, -0x6e, 0x69, 0x73, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, 0x62, 0x72, 0x65, 0x76, 0x69, 0x6c, 0x6c, -0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x65, 0x67, 0x75, 0x63, 0x69, 0x67, 0x61, 0x6c, 0x70, -0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x68, 0x6e, 0x6f, 0x6d, 0x5f, 0x50, 0x65, 0x6e, 0x68, 0x0, 0x41, 0x73, -0x69, 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x69, 0x6c, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x6e, -0x67, 0x75, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x67, 0x68, 0x64, 0x61, 0x64, 0x0, 0x45, 0x75, 0x72, -0x6f, 0x70, 0x65, 0x2f, 0x42, 0x72, 0x75, 0x73, 0x73, 0x65, 0x6c, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x72, -0x65, 0x64, 0x6e, 0x65, 0x6b, 0x6f, 0x6c, 0x79, 0x6d, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x72, 0x75, -0x6d, 0x71, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x68, 0x72, 0x61, 0x69, 0x6e, 0x0, 0x41, 0x73, 0x69, -0x61, 0x2f, 0x44, 0x69, 0x6c, 0x69, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x54, 0x61, 0x6c, 0x6c, 0x69, 0x6e, -0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x75, 0x61, 0x6b, 0x63, 0x68, 0x6f, 0x74, 0x74, 0x0, -0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x62, 0x75, 0x6d, 0x62, 0x61, 0x73, 0x68, 0x69, 0x0, 0x45, 0x75, -0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x61, 0x72, 0x69, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x65, 0x6b, 0x61, -0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x61, -0x73, 0x73, 0x61, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x6f, 0x6e, 0x68, 0x61, -0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x68, 0x69, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, -0x4d, 0x54, 0x2d, 0x38, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x68, 0x61, 0x72, 0x74, 0x6f, 0x75, 0x6d, -0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x66, 0x61, 0x74, 0x65, 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, 0x54, 0x6f, 0x72, 0x74, 0x6f, 0x6c, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x61, 0x6d, -0x70, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x61, 0x6e, 0x64, 0x61, 0x0, 0x45, -0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x43, 0x68, 0x69, 0x73, 0x69, 0x6e, 0x61, 0x75, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, -0x69, 0x63, 0x2f, 0x4b, 0x69, 0x72, 0x69, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, -0x54, 0x2d, 0x31, 0x33, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x6f, 0x5f, 0x44, -0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, 0x75, 0x65, 0x72, 0x6e, 0x73, -0x65, 0x79, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x69, 0x65, 0x76, 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, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x61, 0x62, 0x6f, -0x72, 0x6f, 0x6e, 0x65, 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, 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, 0x46, 0x72, 0x65, 0x65, 0x74, 0x6f, 0x77, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x67, -0x61, 0x64, 0x69, 0x73, 0x68, 0x75, 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, 0x0, 0x41, 0x66, -0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x75, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x68, 0x69, -0x6d, 0x70, 0x68, 0x75, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x6d, 0x73, 0x74, 0x65, 0x72, 0x64, 0x61, -0x6d, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x69, 0x67, 0x61, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, -0x2f, 0x43, 0x6f, 0x6d, 0x6f, 0x72, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x73, 0x69, 0x62, -0x69, 0x72, 0x73, 0x6b, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4f, 0x6d, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, -0x56, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6e, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x6f, 0x64, -0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6f, 0x66, 0x69, 0x61, 0x0, -0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x41, 0x7a, 0x6f, 0x72, 0x65, 0x73, 0x0, 0x50, 0x61, 0x63, 0x69, -0x66, 0x69, 0x63, 0x2f, 0x4e, 0x61, 0x75, 0x72, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x70, -0x75, 0x74, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x20, 0x45, 0x75, -0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x65, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x4b, 0x72, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6a, 0x6b, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, -0x2f, 0x4e, 0x6f, 0x75, 0x6d, 0x65, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x65, 0x68, 0x72, 0x61, 0x6e, 0x0, -0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x68, 0x61, 0x6b, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, -0x6f, 0x73, 0x5f, 0x41, 0x6e, 0x67, 0x65, 0x6c, 0x65, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, -0x6e, 0x61, 0x63, 0x6f, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x41, 0x6e, 0x74, 0x61, 0x6e, 0x61, 0x6e, 0x61, -0x72, 0x69, 0x76, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x49, 0x72, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x0, 0x41, 0x6e, -0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x56, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, -0x70, 0x65, 0x2f, 0x54, 0x69, 0x72, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, -0x65, 0x6e, 0x61, 0x64, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x37, 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, 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, 0x41, 0x6d, 0x65, 0x72, -0x69, 0x63, 0x61, 0x2f, 0x4f, 0x6a, 0x69, 0x6e, 0x61, 0x67, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, -0x6c, 0x61, 0x6e, 0x74, 0x79, 0x72, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x61, 0x6d, 0x61, -0x69, 0x63, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x6e, 0x61, 0x6b, 0x72, 0x79, 0x0, 0x41, -0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61, 0x73, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, -0x69, 0x63, 0x2f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x74, 0x6f, 0x6e, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, -0x63, 0x61, 0x2f, 0x52, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x57, -0x61, 0x6c, 0x6c, 0x69, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x69, 0x67, 0x6f, 0x6e, 0x0, 0x41, 0x66, -0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x6f, -0x6d, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x50, 0x72, 0x69, -0x6e, 0x63, 0x65, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x52, 0x61, 0x6e, 0x67, 0x6f, 0x6f, 0x6e, 0x0, 0x41, 0x6d, -0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, -0x45, 0x6c, 0x5f, 0x41, 0x61, 0x69, 0x75, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, -0x64, 0x61, 0x6c, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x61, 0x6c, 0x69, -0x6e, 0x69, 0x6e, 0x67, 0x72, 0x61, 0x64, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6d, 0x6d, 0x61, 0x6e, 0x0, 0x45, -0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x63, 0x68, 0x61, 0x72, 0x65, 0x73, 0x74, 0x0, 0x41, 0x66, 0x72, 0x69, -0x63, 0x61, 0x2f, 0x42, 0x69, 0x73, 0x73, 0x61, 0x75, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x6e, -0x5f, 0x4d, 0x61, 0x72, 0x69, 0x6e, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x62, -0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x63, 0x68, 0x61, 0x74, 0x6b, 0x61, 0x20, 0x41, 0x73, 0x69, -0x61, 0x2f, 0x41, 0x6e, 0x61, 0x64, 0x79, 0x72, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x61, 0x67, 0x6f, -0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x75, 0x72, 0x61, 0x63, 0x61, 0x6f, 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, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x75, -0x73, 0x63, 0x61, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, 0x6d, 0x61, 0x0, 0x45, 0x75, -0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x75, 0x72, 0x69, 0x63, 0x68, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, -0x2f, 0x52, 0x65, 0x79, 0x6b, 0x6a, 0x61, 0x76, 0x69, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, -0x61, 0x6e, 0x63, 0x75, 0x6e, 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, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, -0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x73, 0x65, 0x79, 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, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x5f, 0x56, -0x65, 0x6c, 0x68, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x2d, 0x4e, 0x6f, -0x76, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x0, 0x45, 0x74, -0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x30, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, -0x4c, 0x75, 0x63, 0x69, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x61, 0x75, 0x0, 0x41, 0x66, 0x72, -0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6c, 0x61, 0x62, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x52, -0x61, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x6e, 0x6a, -0x75, 0x6c, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x34, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, -0x61, 0x67, 0x61, 0x64, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x72, 0x61, 0x74, 0x69, 0x73, -0x6c, 0x61, 0x76, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x6e, 0x64, 0x6f, 0x72, 0x72, 0x61, 0x0, -0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x6b, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, -0x2d, 0x35, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x42, 0x6f, 0x75, 0x67, 0x61, 0x69, 0x6e, 0x76, 0x69, -0x6c, 0x6c, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 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, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x72, 0x69, 0x62, 0x6f, 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, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x72, 0x5f, -0x65, 0x73, 0x5f, 0x53, 0x61, 0x6c, 0x61, 0x61, 0x6d, 0x0, 0x4d, 0x53, 0x54, 0x37, 0x4d, 0x44, 0x54, 0x0, 0x41, 0x66, -0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x73, 0x65, 0x72, 0x75, 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, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x61, 0x69, 0x72, 0x6f, 0x62, 0x69, 0x0, -0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x73, 0x68, 0x67, 0x61, 0x62, 0x61, 0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, -0x6f, 0x6e, 0x67, 0x5f, 0x4b, 0x6f, 0x6e, 0x67, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x33, 0x0, 0x41, -0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x53, 0x61, 0x6f, 0x5f, 0x50, 0x61, 0x75, 0x6c, 0x6f, 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, 0x4a, 0x61, 0x6b, 0x61, 0x72, 0x74, 0x61, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x6f, 0x6e, -0x74, 0x69, 0x61, 0x6e, 0x61, 0x6b, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x39, 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, 0x4d, 0x65, -0x74, 0x6c, 0x61, 0x6b, 0x61, 0x74, 0x6c, 0x61, 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, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x43, -0x6f, 0x70, 0x65, 0x6e, 0x68, 0x61, 0x67, 0x65, 0x6e, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, -0x2f, 0x4d, 0x63, 0x4d, 0x75, 0x72, 0x64, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51, 0x61, 0x74, 0x61, 0x72, 0x0, -0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x69, 0x67, 0x6f, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, -0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x6f, 0x73, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, -0x2f, 0x57, 0x61, 0x6b, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x48, 0x65, 0x6c, 0x73, 0x69, 0x6e, 0x6b, -0x69, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x79, 0x6f, 0x74, 0x74, 0x65, 0x0, 0x41, 0x74, 0x6c, -0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x46, 0x61, 0x65, 0x72, 0x6f, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x43, 0x6f, 0x72, 0x61, 0x6c, 0x5f, 0x48, 0x61, 0x72, 0x62, 0x6f, 0x75, 0x72, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, -0x4d, 0x54, 0x2b, 0x31, 0x30, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x72, 0x61, 0x6a, 0x65, 0x76, -0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x62, 0x69, 0x6c, 0x69, 0x73, 0x69, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, -0x4d, 0x54, 0x2b, 0x31, 0x31, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x63, -0x71, 0x75, 0x61, 0x72, 0x69, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f, -0x4d, 0x6f, 0x72, 0x65, 0x73, 0x62, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x73, 0x75, 0x6e, -0x63, 0x69, 0x6f, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x61, 0x68, 0x69, 0x74, 0x69, 0x0, -0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x6d, 0x65, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, -0x2f, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x6f, 0x68, 0x61, 0x6e, -0x6e, 0x65, 0x73, 0x62, 0x75, 0x72, 0x67, 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, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x53, 0x61, 0x69, -0x70, 0x61, 0x6e, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x74, 0x61, 0x6e, 0x6c, 0x65, 0x79, -0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x69, 0x63, 0x6f, 0x73, 0x69, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, -0x75, 0x62, 0x61, 0x69, 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, 0x4e, 0x64, 0x6a, 0x61, 0x6d, 0x65, 0x6e, 0x61, 0x0, 0x45, 0x75, -0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6b, 0x6f, 0x70, 0x6a, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x64, 0x65, -0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x41, 0x70, 0x69, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, -0x69, 0x63, 0x2f, 0x48, 0x6f, 0x6e, 0x6f, 0x6c, 0x75, 0x6c, 0x75, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, -0x31, 0x32, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x65, 0x72, 0x6d, 0x6f, 0x73, 0x69, 0x6c, 0x6c, -0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x0, 0x50, -0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x41, 0x75, 0x63, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x0, 0x45, 0x75, 0x72, 0x6f, -0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x73, 0x63, 0x6f, 0x77, 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, 0x56, 0x6f, 0x6c, 0x67, 0x6f, -0x67, 0x72, 0x61, 0x64, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x0, -0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x62, 0x75, 0x6c, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, -0x6c, 0x74, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x75, 0x62, 0x61, 0x0, 0x41, 0x6d, +0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x66, 0x5f, 0x53, 0x70, 0x61, 0x69, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x47, 0x61, 0x62, 0x6f, 0x72, 0x6f, 0x6e, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, +0x35, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x79, 0x61, 0x71, 0x75, 0x69, 0x6c, 0x0, +0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x74, 0x68, 0x65, 0x6e, 0x73, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, +0x2f, 0x41, 0x6e, 0x74, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x76, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, +0x63, 0x2f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x74, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, +0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x6f, 0x0, +0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x6c, 0x67, 0x72, 0x61, 0x64, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, +0x2f, 0x41, 0x6c, 0x6d, 0x61, 0x74, 0x79, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51, 0x6f, 0x73, 0x74, 0x61, 0x6e, 0x61, +0x79, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x33, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x43, 0x6f, 0x72, 0x61, 0x6c, 0x5f, 0x48, 0x61, 0x72, 0x62, 0x6f, 0x75, 0x72, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, +0x6e, 0x2f, 0x43, 0x68, 0x61, 0x67, 0x6f, 0x73, 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, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x75, 0x65, 0x72, 0x74, 0x6f, 0x5f, 0x52, 0x69, +0x63, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4b, 0x69, 0x74, 0x74, 0x73, 0x0, +0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x75, 0x72, 0x69, 0x63, 0x68, 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, 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, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, +0x61, 0x6d, 0x62, 0x69, 0x65, 0x72, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x69, 0x61, 0x6d, 0x65, 0x79, +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, 0x4d, 0x6f, 0x67, 0x61, 0x64, 0x69, 0x73, 0x68, 0x75, 0x0, 0x45, 0x74, 0x63, +0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x37, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x42, 0x65, 0x72, 0x6d, +0x75, 0x64, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x72, 0x61, 0x72, 0x65, 0x0, 0x41, 0x73, +0x69, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x61, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6c, 0x61, +0x62, 0x6f, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75, 0x73, 0x0, +0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x54, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x44, 0x61, 0x6b, 0x61, 0x72, 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, +0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x74, 0x79, 0x72, 0x61, 0x75, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51, 0x79, +0x7a, 0x79, 0x6c, 0x6f, 0x72, 0x64, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x72, 0x75, 0x6d, 0x71, 0x69, 0x0, +0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x6f, 0x6d, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, +0x73, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x5f, 0x4d, 0x61, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, +0x72, 0x5f, 0x65, 0x73, 0x5f, 0x53, 0x61, 0x6c, 0x61, 0x61, 0x6d, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x54, 0x68, 0x75, 0x6c, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x6e, 0x6d, 0x61, 0x72, +0x6b, 0x73, 0x68, 0x61, 0x76, 0x6e, 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, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x62, 0x79, +0x73, 0x75, 0x6e, 0x64, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x73, 0x61, 0x62, 0x6c, 0x61, 0x6e, +0x63, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x61, 0x6e, 0x64, 0x5f, 0x54, 0x75, 0x72, +0x6b, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x6e, 0x6a, 0x75, 0x6c, 0x0, 0x41, 0x66, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x4e, 0x64, 0x6a, 0x61, 0x6d, 0x65, 0x6e, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x65, 0x72, +0x75, 0x73, 0x61, 0x6c, 0x65, 0x6d, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, +0x6c, 0x6d, 0x65, 0x72, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x45, 0x75, 0x63, 0x6c, 0x61, +0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x75, 0x61, 0x0, 0x41, 0x73, 0x69, +0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x69, 0x6c, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x53, 0x61, 0x69, +0x70, 0x61, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x0, 0x45, 0x75, 0x72, +0x6f, 0x70, 0x65, 0x2f, 0x42, 0x72, 0x75, 0x73, 0x73, 0x65, 0x6c, 0x73, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, +0x69, 0x63, 0x61, 0x2f, 0x4d, 0x63, 0x4d, 0x75, 0x72, 0x64, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, +0x75, 0x63, 0x68, 0x61, 0x72, 0x65, 0x73, 0x74, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x32, 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, 0x66, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x2d, 0x4e, 0x6f, 0x76, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x49, +0x72, 0x6b, 0x75, 0x74, 0x73, 0x6b, 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, +0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x65, 0x6e, 0x6e, 0x61, 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, +0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6a, 0x6b, 0x0, 0x50, 0x61, +0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x61, 0x75, 0x72, 0x75, 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, 0x41, 0x73, +0x69, 0x61, 0x2f, 0x4d, 0x61, 0x67, 0x61, 0x64, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4f, 0x73, +0x6c, 0x6f, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x39, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, +0x2f, 0x47, 0x61, 0x6c, 0x61, 0x70, 0x61, 0x67, 0x6f, 0x73, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, +0x6a, 0x75, 0x6d, 0x62, 0x75, 0x72, 0x61, 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, 0x45, 0x74, 0x63, 0x2f, +0x47, 0x4d, 0x54, 0x2d, 0x31, 0x31, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x65, 0x6e, 0x61, +0x64, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x6f, 0x75, 0x6d, 0x65, 0x61, 0x0, 0x41, 0x6d, +0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x6e, 0x63, 0x75, 0x6e, 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, 0x47, 0x6f, 0x64, +0x74, 0x68, 0x61, 0x62, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x69, 0x73, 0x73, 0x61, 0x75, 0x0, 0x45, +0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x6e, 0x5f, 0x4d, 0x61, 0x72, 0x69, 0x6e, 0x6f, 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, 0x54, 0x65, 0x67, 0x75, 0x63, 0x69, 0x67, 0x61, 0x6c, 0x70, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, +0x69, 0x61, 0x2f, 0x4c, 0x6f, 0x72, 0x64, 0x5f, 0x48, 0x6f, 0x77, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, +0x2d, 0x33, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, 0x62, 0x72, 0x65, 0x76, 0x69, 0x6c, 0x6c, 0x65, +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, 0x4c, 0x6f, 0x6e, 0x64, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, +0x2d, 0x31, 0x32, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x0, 0x41, +0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x52, 0x65, 0x79, 0x6b, 0x6a, 0x61, 0x76, 0x69, 0x6b, 0x0, 0x41, 0x6d, +0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x76, 0x61, 0x6e, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x4e, 0x61, 0x73, 0x73, 0x61, 0x75, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x6f, 0x75, +0x74, 0x68, 0x5f, 0x47, 0x65, 0x6f, 0x72, 0x67, 0x69, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, +0x6c, 0x5f, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x64, 0x6f, 0x72, 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, 0x45, +0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x34, 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, +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, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, +0x63, 0x2f, 0x46, 0x75, 0x6e, 0x61, 0x66, 0x75, 0x74, 0x69, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, 0x69, +0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4f, 0x6d, 0x73, 0x6b, 0x0, 0x41, 0x66, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x72, 0x69, 0x70, 0x6f, 0x6c, 0x69, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, +0x69, 0x63, 0x61, 0x2f, 0x56, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, +0x72, 0x75, 0x62, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x65, 0x69, 0x72, 0x75, 0x74, 0x0, 0x45, 0x74, 0x63, +0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x38, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x64, 0x68, 0x6f, +0x65, 0x6b, 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, 0x53, 0x74, 0x5f, 0x54, 0x68, 0x6f, 0x6d, 0x61, 0x73, 0x0, 0x45, 0x74, 0x63, +0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x74, 0x69, 0x67, +0x75, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, 0x6d, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, +0x70, 0x65, 0x2f, 0x4d, 0x61, 0x72, 0x69, 0x65, 0x68, 0x61, 0x6d, 0x6e, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, +0x63, 0x2f, 0x53, 0x74, 0x5f, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, +0x54, 0x72, 0x75, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x0, +0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x6f, 0x5f, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, +0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6c, 0x61, 0x6e, 0x74, 0x79, 0x72, 0x65, 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, 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, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, -0x2f, 0x49, 0x73, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x5f, 0x4d, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, -0x56, 0x61, 0x64, 0x75, 0x7a, 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, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x65, 0x6f, 0x75, 0x6c, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x47, 0x75, 0x61, 0x64, 0x65, 0x6c, 0x6f, 0x75, 0x70, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, -0x2b, 0x32, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x6f, 0x63, 0x6f, 0x73, 0x0, 0x41, 0x72, 0x63, 0x74, -0x69, 0x63, 0x2f, 0x4c, 0x6f, 0x6e, 0x67, 0x79, 0x65, 0x61, 0x72, 0x62, 0x79, 0x65, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, -0x63, 0x61, 0x2f, 0x41, 0x64, 0x64, 0x69, 0x73, 0x5f, 0x41, 0x62, 0x61, 0x62, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, -0x65, 0x2f, 0x53, 0x61, 0x6d, 0x61, 0x72, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x72, 0x61, -0x72, 0x65, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x50, 0x65, 0x72, 0x74, 0x68, 0x0, 0x45, -0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x76, -0x61, 0x6e, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x73, 0x61, 0x62, 0x6c, 0x61, 0x6e, 0x63, -0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x65, 0x72, 0x65, 0x76, 0x61, 0x6e, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, -0x74, 0x69, 0x63, 0x2f, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x69, -0x70, 0x65, 0x69, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x36, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x47, 0x6f, 0x64, 0x74, 0x68, 0x61, 0x62, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x57, 0x61, 0x72, -0x73, 0x61, 0x77, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x74, 0x61, 0x70, -0x75, 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, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, -0x44, 0x61, 0x76, 0x69, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x65, 0x69, 0x72, 0x75, 0x74, 0x0, 0x41, 0x6d, -0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, -0x2f, 0x4b, 0x61, 0x72, 0x61, 0x63, 0x68, 0x69, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x63, 0x63, 0x72, -0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x75, 0x65, 0x72, 0x74, 0x6f, 0x5f, 0x52, 0x69, 0x63, -0x6f, 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, 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, 0x73, 0x69, 0x61, 0x2f, 0x44, -0x61, 0x6d, 0x61, 0x73, 0x63, 0x75, 0x73, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x61, 0x72, 0x61, -0x77, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x34, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x42, 0x6f, 0x67, 0x6f, 0x74, 0x61, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, 0x61, 0x70, -0x65, 0x5f, 0x56, 0x65, 0x72, 0x64, 0x65, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x44, 0x61, -0x72, 0x77, 0x69, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x79, 0x6f, 0x6e, 0x67, 0x79, 0x61, 0x6e, 0x67, 0x0, -0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x6b, 0x75, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, 0x69, 0x62, -0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x65, 0x72, 0x75, 0x73, 0x61, 0x6c, 0x65, -0x6d, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x6a, 0x75, 0x62, 0x6c, 0x6a, 0x61, 0x6e, 0x61, 0x0, 0x50, -0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, -0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 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, 0x4b, 0x61, 0x74, 0x6d, 0x61, 0x6e, 0x64, 0x75, 0x0, -0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x74, 0x74, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x41, 0x6e, 0x74, 0x69, 0x67, 0x75, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4a, 0x65, 0x72, -0x73, 0x65, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x73, 0x65, 0x72, 0x72, -0x61, 0x74, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x37, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x6b, 0x61, 0x72, -0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4f, 0x73, 0x6c, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, -0x41, 0x74, 0x68, 0x65, 0x6e, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x77, 0x61, 0x69, 0x74, 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, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x73, -0x74, 0x61, 0x5f, 0x52, 0x69, 0x63, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x6d, 0x69, -0x6e, 0x69, 0x63, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x62, 0x61, 0x62, 0x61, 0x6e, 0x65, 0x0, -0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x0, 0x49, -0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x52, 0x65, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, -0x54, 0x2b, 0x36, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, 0x73, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x6c, 0x0, -0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x73, 0x6e, 0x6f, 0x79, 0x61, 0x72, 0x73, 0x6b, 0x20, 0x41, 0x73, 0x69, -0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x6b, 0x75, 0x7a, 0x6e, 0x65, 0x74, 0x73, 0x6b, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x41, 0x62, 0x69, 0x64, 0x6a, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x69, -0x6f, 0x5f, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x69, 0x72, -0x75, 0x6e, 0x65, 0x70, 0x65, 0x0, 0x43, 0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x50, 0x68, 0x6f, 0x65, 0x6e, 0x69, 0x78, 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, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x35, 0x0, 0x41, 0x6e, 0x74, -0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x77, 0x73, 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, 0x42, 0x65, -0x6c, 0x67, 0x72, 0x61, 0x64, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x73, 0x6d, 0x65, 0x72, 0x61, -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, 0x20, 0x41, 0x6d, -0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x6f, 0x72, 0x74, 0x5f, 0x4e, 0x65, 0x6c, 0x73, 0x6f, 0x6e, 0x0, 0x45, 0x75, -0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, -0x2f, 0x57, 0x69, 0x6e, 0x64, 0x68, 0x6f, 0x65, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x61, 0x79, 0x61, 0x70, -0x75, 0x72, 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, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x34, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, -0x43, 0x61, 0x72, 0x61, 0x63, 0x61, 0x73, 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, 0x5a, 0x61, 0x67, 0x72, 0x65, 0x62, 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, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, -0x63, 0x61, 0x2f, 0x50, 0x61, 0x6c, 0x6d, 0x65, 0x72, 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, 0x66, 0x72, 0x69, 0x63, -0x61, 0x2f, 0x42, 0x61, 0x6d, 0x61, 0x6b, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x52, 0x69, 0x79, 0x61, 0x64, 0x68, -0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x72, 0x75, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, -0x6f, 0x6b, 0x79, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x6e, 0x64, 0x65, 0x72, 0x62, 0x75, -0x72, 0x79, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x6f, 0x6e, 0x64, 0x6f, 0x6e, 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, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x6f, 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, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, -0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 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, 0x66, 0x72, 0x69, -0x63, 0x61, 0x2f, 0x53, 0x61, 0x6f, 0x5f, 0x54, 0x6f, 0x6d, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, -0x53, 0x74, 0x5f, 0x54, 0x68, 0x6f, 0x6d, 0x61, 0x73, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x73, -0x61, 0x6b, 0x61, 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, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x69, 0x61, 0x6d, 0x65, 0x79, -0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x33, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6c, -0x67, 0x69, 0x65, 0x72, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x79, 0x61, 0x71, -0x75, 0x69, 0x6c, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x68, 0x61, 0x67, 0x6f, 0x73, 0x0, 0x41, 0x73, -0x69, 0x61, 0x2f, 0x53, 0x68, 0x61, 0x6e, 0x67, 0x68, 0x61, 0x69, 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, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x69, 0x64, 0x77, -0x61, 0x79, 0x0, 0x45, 0x53, 0x54, 0x35, 0x45, 0x44, 0x54, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x68, -0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x61, 0x6c, 0x61, -0x70, 0x61, 0x67, 0x6f, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x67, 0x75, 0x69, 0x6c, -0x6c, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x0, 0x41, 0x6d, -0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4b, 0x69, 0x74, 0x74, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, -0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x67, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, -0x50, 0x61, 0x6c, 0x61, 0x75, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x61, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x20, 0x41, -0x73, 0x69, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x74, 0x61, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x68, 0x61, 0x6e, 0x64, -0x79, 0x67, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x6c, 0x6e, 0x69, 0x75, 0x73, 0x0, 0x41, -0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x72, 0x6f, 0x76, 0x69, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, -0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x6d, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x6e, 0x6d, -0x61, 0x72, 0x6b, 0x73, 0x68, 0x61, 0x76, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46, 0x69, 0x6a, -0x69, 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, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x62, 0x79, 0x73, 0x75, 0x6e, 0x64, 0x0, 0x41, -0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x42, 0x61, 0x72, 0x74, 0x68, 0x65, 0x6c, 0x65, 0x6d, 0x79, -0x0, 0x50, 0x53, 0x54, 0x38, 0x50, 0x44, 0x54, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x61, -0x6e, 0x64, 0x5f, 0x54, 0x75, 0x72, 0x6b, 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, 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, 0x74, -0x61, 0x6d, 0x6f, 0x72, 0x6f, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x68, 0x75, 0x6c, 0x65, -0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x31, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, -0x2f, 0x53, 0x74, 0x5f, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, -0x69, 0x75, 0x65, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75, 0x73, -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, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, -0x54, 0x2d, 0x32, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x69, 0x6e, 0x73, 0x6b, 0x0, 0x41, 0x66, 0x72, -0x69, 0x63, 0x61, 0x2f, 0x4a, 0x75, 0x62, 0x61, 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, 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, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, -0x73, 0x74, 0x2d, 0x4e, 0x65, 0x72, 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, 0x44, 0x75, 0x62, 0x6c, 0x69, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x65, 0x6e, 0x6e, -0x61, 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, 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, -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, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x73, 0x6e, 0x6f, -0x79, 0x61, 0x72, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x63, 0x68, 0x61, 0x74, 0x6b, 0x61, -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, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x72, 0x6c, 0x69, 0x6e, -0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x73, 0x68, 0x6b, 0x65, 0x6e, 0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, -0x59, 0x61, 0x6b, 0x75, 0x74, 0x73, 0x6b, 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, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x38, 0x3a, 0x33, -0x30, 0x0 +0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x65, 0x79, 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, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46, 0x69, 0x6a, 0x69, 0x0, 0x41, 0x6d, +0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x68, 0x6f, 0x65, 0x6e, 0x69, 0x78, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, +0x68, 0x69, 0x6d, 0x70, 0x68, 0x75, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x6c, 0x74, 0x61, 0x0, +0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x73, 0x63, 0x6f, 0x77, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, +0x2f, 0x4b, 0x69, 0x72, 0x6f, 0x76, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x6f, 0x6c, 0x67, 0x6f, 0x67, +0x72, 0x61, 0x64, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x71, +0x75, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x32, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, +0x61, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x68, 0x61, 0x6e, 0x64, 0x79, 0x67, 0x61, +0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x62, 0x75, 0x6c, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x20, +0x45, 0x74, 0x63, 0x2f, 0x55, 0x54, 0x43, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x74, 0x61, +0x6d, 0x6f, 0x72, 0x6f, 0x73, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x34, 0x0, 0x49, 0x6e, 0x64, 0x69, +0x61, 0x6e, 0x2f, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, +0x63, 0x2f, 0x41, 0x7a, 0x6f, 0x72, 0x65, 0x73, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x0, 0x41, +0x73, 0x69, 0x61, 0x2f, 0x44, 0x68, 0x61, 0x6b, 0x61, 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, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x35, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, +0x69, 0x63, 0x2f, 0x46, 0x61, 0x6b, 0x61, 0x6f, 0x66, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, +0x73, 0x69, 0x62, 0x69, 0x72, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x65, 0x62, 0x72, 0x6f, 0x6e, 0x20, +0x41, 0x73, 0x69, 0x61, 0x2f, 0x47, 0x61, 0x7a, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, 0x73, 0x74, +0x61, 0x6e, 0x62, 0x75, 0x6c, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x64, 0x61, 0x6b, 0x0, 0x45, +0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x37, 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, 0x0, 0x41, 0x66, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x64, 0x64, 0x69, 0x73, 0x5f, 0x41, 0x62, 0x61, 0x62, 0x61, 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, 0x4d, 0x61, 0x72, 0x69, 0x67, 0x6f, 0x74, 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, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x6c, 0x6e, 0x69, 0x75, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, +0x70, 0x65, 0x2f, 0x42, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x73, +0x69, 0x6e, 0x67, 0x65, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x61, 0x72, 0x71, 0x75, 0x65, +0x73, 0x61, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x73, 0x6e, 0x6f, 0x79, 0x61, 0x72, 0x73, 0x6b, +0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x6b, 0x75, 0x7a, 0x6e, 0x65, 0x74, 0x73, 0x6b, 0x0, 0x50, +0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4b, 0x69, 0x72, 0x69, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x0, 0x41, 0x6d, +0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x69, 0x71, 0x75, 0x65, 0x6c, 0x6f, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, +0x65, 0x2f, 0x44, 0x75, 0x62, 0x6c, 0x69, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x52, 0x69, 0x79, 0x61, 0x64, 0x68, +0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x67, 0x6f, 0x0, 0x41, 0x73, +0x69, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x63, 0x68, 0x61, 0x74, 0x6b, 0x61, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6e, +0x61, 0x64, 0x79, 0x72, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x6f, 0x6d, 0x6f, 0x72, 0x6f, 0x0, 0x41, +0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x75, 0x72, 0x61, 0x63, 0x61, 0x6f, 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, 0x42, +0x65, 0x6c, 0x69, 0x7a, 0x65, 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, 0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, +0x6f, 0x6b, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x73, 0x74, 0x2d, 0x4e, 0x65, 0x72, 0x61, 0x0, 0x45, 0x74, 0x63, +0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x32, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x61, 0x6d, 0x61, 0x73, 0x63, 0x75, 0x73, +0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x79, 0x65, 0x6e, 0x6e, 0x65, 0x0, 0x41, 0x66, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x75, 0x61, 0x6b, 0x63, 0x68, 0x6f, 0x74, 0x74, 0x0, 0x45, 0x53, 0x54, 0x35, 0x45, +0x44, 0x54, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x68, 0x69, 0x61, 0x0, 0x50, 0x61, 0x63, +0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, +0x33, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x73, 0x74, 0x72, 0x61, 0x6b, 0x68, 0x61, 0x6e, 0x20, 0x45, +0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x55, 0x6c, 0x79, 0x61, 0x6e, 0x6f, 0x76, 0x73, 0x6b, 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, 0x50, 0x6f, 0x72, +0x74, 0x6f, 0x5f, 0x56, 0x65, 0x6c, 0x68, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x69, 0x6e, 0x73, +0x6b, 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, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x4c, 0x61, 0x67, 0x6f, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x6e, 0x64, 0x6f, 0x72, 0x72, 0x61, +0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x61, 0x6c, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x72, 0x61, 0x64, 0x0, +0x4d, 0x53, 0x54, 0x37, 0x4d, 0x44, 0x54, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x67, 0x75, +0x69, 0x6c, 0x6c, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x57, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x0, +0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x75, 0x62, 0x61, 0x69, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, +0x61, 0x79, 0x6d, 0x61, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x6b, 0x0, 0x50, +0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x64, 0x61, 0x6c, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x0, 0x41, +0x73, 0x69, 0x61, 0x2f, 0x54, 0x62, 0x69, 0x6c, 0x69, 0x73, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x68, 0x6e, +0x6f, 0x6d, 0x5f, 0x50, 0x65, 0x6e, 0x68, 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, 0x41, 0x73, 0x69, +0x61, 0x2f, 0x46, 0x61, 0x6d, 0x61, 0x67, 0x75, 0x73, 0x74, 0x61, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x69, 0x63, +0x6f, 0x73, 0x69, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x64, 0x65, 0x6c, 0x6f, +0x75, 0x70, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x69, 0x67, 0x6f, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, +0x2f, 0x43, 0x68, 0x69, 0x74, 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, 0x54, 0x6f, 0x72, 0x74, 0x6f, 0x6c, 0x61, 0x0, 0x41, +0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61, 0x73, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, +0x53, 0x61, 0x6b, 0x68, 0x61, 0x6c, 0x69, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x57, 0x61, 0x6b, +0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x63, 0x63, 0x72, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, +0x69, 0x63, 0x2f, 0x41, 0x75, 0x63, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 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, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, +0x2f, 0x54, 0x61, 0x68, 0x69, 0x74, 0x69, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4f, 0x75, 0x61, 0x67, 0x61, +0x64, 0x6f, 0x75, 0x67, 0x6f, 0x75, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4b, 0x65, 0x72, 0x67, 0x75, 0x65, +0x6c, 0x65, 0x6e, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x38, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, +0x2f, 0x54, 0x69, 0x72, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x69, 0x70, 0x65, 0x69, 0x0, +0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x43, 0x6f, 0x70, 0x65, 0x6e, 0x68, 0x61, 0x67, 0x65, 0x6e, 0x0, 0x41, 0x66, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x70, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x6f, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x6b, 0x75, 0x0, +0x41, 0x73, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x6e, 0x67, 0x5f, 0x4b, 0x6f, 0x6e, 0x67, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, +0x4a, 0x61, 0x79, 0x61, 0x70, 0x75, 0x72, 0x61, 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, 0x4e, 0x61, 0x69, 0x72, 0x6f, 0x62, 0x69, +0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x6d, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x4a, 0x75, 0x62, 0x61, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x46, 0x61, 0x65, 0x72, 0x6f, +0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x72, 0x65, 0x64, 0x6e, 0x65, 0x6b, 0x6f, 0x6c, 0x79, 0x6d, 0x73, 0x6b, +0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x69, 0x75, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x41, 0x6c, 0x67, 0x69, 0x65, 0x72, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x69, 0x6c, 0x69, 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, 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, 0x50, 0x6f, 0x64, 0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, +0x61, 0x2f, 0x44, 0x6f, 0x75, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x56, 0x69, 0x65, 0x6e, 0x74, 0x69, +0x61, 0x6e, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x69, 0x6a, 0x75, 0x61, 0x6e, 0x61, 0x20, +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, 0x4c, 0x6f, 0x6d, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, +0x52, 0x69, 0x67, 0x61, 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, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x65, 0x0, +0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x0, 0x41, 0x73, 0x69, +0x61, 0x2f, 0x54, 0x6f, 0x6b, 0x79, 0x6f, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x36, 0x0, 0x45, 0x75, +0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x72, 0x61, 0x6a, 0x65, 0x76, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, +0x2f, 0x42, 0x72, 0x61, 0x74, 0x69, 0x73, 0x6c, 0x61, 0x76, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, +0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, 0x61, 0x6e, 0x61, +0x72, 0x79, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x42, 0x6f, 0x75, 0x67, 0x61, 0x69, 0x6e, 0x76, 0x69, +0x6c, 0x6c, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x68, 0x72, 0x61, 0x69, 0x6e, 0x0, 0x41, 0x6d, 0x65, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, +0x63, 0x61, 0x2f, 0x4c, 0x61, 0x5f, 0x50, 0x61, 0x7a, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x79, 0x6f, 0x6e, 0x67, +0x79, 0x61, 0x6e, 0x67, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x61, 0x67, 0x6f, 0x5f, 0x50, 0x61, +0x67, 0x6f, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x52, 0x65, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x0, 0x41, 0x66, +0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x73, 0x65, 0x72, 0x75, 0x0, 0x50, 0x53, 0x54, 0x38, 0x50, 0x44, 0x54, 0x0, +0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x39, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x75, 0x6e, +0x69, 0x73, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6f, 0x5f, 0x54, 0x6f, 0x6d, 0x65, 0x0, 0x45, +0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x76, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x4b, 0x68, 0x61, 0x72, 0x74, 0x6f, 0x75, 0x6d, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4a, 0x65, 0x72, +0x73, 0x65, 0x79, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x71, 0x75, +0x61, 0x72, 0x69, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4f, 0x6a, 0x69, 0x6e, 0x61, 0x67, 0x61, +0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, 0x61, 0x70, 0x65, 0x5f, 0x56, 0x65, 0x72, 0x64, 0x65, +0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x6b, 0x61, 0x73, 0x73, 0x61, 0x72, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, +0x65, 0x2f, 0x4c, 0x6a, 0x75, 0x62, 0x6c, 0x6a, 0x61, 0x6e, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, +0x75, 0x65, 0x72, 0x6e, 0x73, 0x65, 0x79, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, +0x61, 0x77, 0x73, 0x6f, 0x6e, 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, 0x50, +0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x41, 0x70, 0x69, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, +0x61, 0x6e, 0x67, 0x75, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x6f, 0x6d, 0x73, 0x6b, 0x0, 0x50, 0x61, 0x63, +0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x61, 0x6c, 0x61, 0x75, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, +0x2f, 0x44, 0x61, 0x72, 0x77, 0x69, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x69, 0x74, 0x63, +0x61, 0x69, 0x72, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 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, 0x53, 0x61, 0x6d, 0x61, 0x72, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x50, +0x65, 0x72, 0x74, 0x68, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x57, 0x61, 0x72, 0x73, 0x61, 0x77, 0x0, 0x49, +0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x6f, 0x63, 0x6f, 0x73, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, +0x61, 0x68, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x73, 0x5f, 0x41, 0x6e, 0x67, 0x65, +0x6c, 0x65, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x74, 0x6c, 0x61, 0x6b, 0x61, 0x74, +0x6c, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x74, 0x74, 0x61, 0x0, 0x41, 0x66, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x41, 0x62, 0x69, 0x64, 0x6a, 0x61, 0x6e, 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, 0x45, 0x75, 0x72, 0x6f, +0x70, 0x65, 0x2f, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x6f, 0x75, 0x72, 0x67, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, +0x2f, 0x42, 0x61, 0x6d, 0x61, 0x6b, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x67, 0x61, 0x6c, +0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51, 0x61, 0x74, 0x61, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, +0x72, 0x61, 0x63, 0x68, 0x69, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x30, 0x0, 0x41, 0x66, 0x72, +0x69, 0x63, 0x61, 0x2f, 0x44, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x65, +0x6b, 0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75, 0x72, 0x67, 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, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x6f, 0x72, +0x74, 0x5f, 0x4e, 0x65, 0x6c, 0x73, 0x6f, 0x6e, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x79, 0x6f, +0x74, 0x74, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6b, 0x6f, 0x70, 0x6a, 0x65, 0x0, 0x41, 0x73, +0x69, 0x61, 0x2f, 0x53, 0x65, 0x6f, 0x75, 0x6c, 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, 0x53, 0x74, 0x6f, 0x63, 0x6b, +0x68, 0x6f, 0x6c, 0x6d, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x62, 0x75, 0x6d, 0x62, 0x61, 0x73, +0x68, 0x69, 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, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x73, 0x74, 0x72, 0x61, 0x6b, 0x68, 0x61, 0x6e, 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, 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, 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, 0x4b, 0x72, 0x61, 0x73, 0x6e, +0x6f, 0x79, 0x61, 0x72, 0x73, 0x6b, 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, 0x54, 0x69, 0x6a, 0x75, 0x61, +0x6e, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x63, 0x68, 0x61, 0x74, 0x6b, 0x61, 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, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, +0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, +0x65, 0x72, 0x6c, 0x69, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x73, 0x68, 0x6b, 0x65, 0x6e, 0x74, 0x0, +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, 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, 0x38, 0x3a, 0x33, 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 -- cgit v1.2.3 From d2090b764aa23f9b50215aa5d276583117c328d3 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Fri, 24 May 2019 14:29:54 +0200 Subject: Convert some deprecations to QT_DEPRECATED_X To make their replacements easier to find. They're in the documentation, but weren't in the source. Change-Id: Iea936062feaead636e3dd8e93f0b4c82ed8876cb Reviewed-by: Thiago Macieira --- src/corelib/tools/qdatetime.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qdatetime.h b/src/corelib/tools/qdatetime.h index 79fd25d762..1ff187a9bd 100644 --- a/src/corelib/tools/qdatetime.h +++ b/src/corelib/tools/qdatetime.h @@ -107,8 +107,8 @@ public: QString toString(QStringView format) const; #endif #if QT_DEPRECATED_SINCE(5,0) -QT_DEPRECATED inline bool setYMD(int y, int m, int d) -{ if (uint(y) <= 99) y += 1900; return setDate(y, m, d); } + QT_DEPRECATED_X("Use setDate() instead") inline bool setYMD(int y, int m, int d) + { if (uint(y) <= 99) y += 1900; return setDate(y, m, d); } #endif bool setDate(int year, int month, int day); @@ -342,8 +342,8 @@ public: inline bool operator>=(const QDateTime &other) const { return !(*this < other); } #if QT_DEPRECATED_SINCE(5, 2) // ### Qt 6: remove - QT_DEPRECATED void setUtcOffset(int seconds); - QT_DEPRECATED int utcOffset() const; + QT_DEPRECATED_X("Use setOffsetFromUtc() instead") void setUtcOffset(int seconds); + QT_DEPRECATED_X("Use offsetFromUtc() instead") int utcOffset() const; #endif // QT_DEPRECATED_SINCE static QDateTime currentDateTime(); -- cgit v1.2.3 From ed99a591a83a399458f12341d0a1c0b3152f247a Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Mon, 6 May 2019 18:19:06 +0200 Subject: Deprecate use of QTime as a timer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QElapsedTimer does the job better and without the DST kludges. Change-Id: Ic4a566f695648cbe069a21ea8d3e84562b665a3c Reviewed-by: André Hartmann Reviewed-by: Thiago Macieira --- src/corelib/tools/qdatetime.cpp | 16 ++++++---------- src/corelib/tools/qdatetime.h | 8 +++++--- 2 files changed, 11 insertions(+), 13 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp index 0f8c8629a8..9220d210f1 100644 --- a/src/corelib/tools/qdatetime.cpp +++ b/src/corelib/tools/qdatetime.cpp @@ -1686,12 +1686,10 @@ bool QDate::isLeapYear(int y) \brief The QTime class provides clock time functions. - A QTime object contains a clock time, which it can express as the - numbers of hours, minutes, seconds, and milliseconds since - midnight. It can read the current time from the system clock and - measure a span of elapsed time. It provides functions for - comparing times and for manipulating a time by adding a number of - milliseconds. + A QTime object contains a clock time, which it can express as the numbers of + hours, minutes, seconds, and milliseconds since midnight. It provides + functions for comparing times and for manipulating a time by adding a number + of milliseconds. QTime uses the 24-hour clock format; it has no concept of AM/PM. Unlike QDateTime, QTime knows nothing about time zones or @@ -1718,9 +1716,6 @@ bool QDate::isLeapYear(int y) objects; an earlier time is considered smaller than a later one; if A.msecsTo(B) is positive, then A < B. - QTime can be used to measure a span of elapsed time using the - start(), restart(), and elapsed() functions. - \sa QDate, QDateTime */ @@ -2364,7 +2359,7 @@ bool QTime::isValid(int h, int m, int s, int ms) return (uint)h < 24 && (uint)m < 60 && (uint)s < 60 && (uint)ms < 1000; } - +#if QT_DEPRECATED_SINCE(5, 14) // ### Qt 6: remove /*! Sets this time to the current time. This is practical for timing: @@ -2433,6 +2428,7 @@ int QTime::elapsed() const n += 86400 * 1000; return n; } +#endif // Use QElapsedTimer instead ! /***************************************************************************** QDateTime static helper functions diff --git a/src/corelib/tools/qdatetime.h b/src/corelib/tools/qdatetime.h index 1ff187a9bd..3e3b953b52 100644 --- a/src/corelib/tools/qdatetime.h +++ b/src/corelib/tools/qdatetime.h @@ -206,9 +206,11 @@ public: #endif static bool isValid(int h, int m, int s, int ms = 0); - void start(); - int restart(); - int elapsed() const; +#if QT_DEPRECATED_SINCE(5, 14) // ### Qt 6: remove + QT_DEPRECATED_X("Use QElapsedTimer instead") void start(); + QT_DEPRECATED_X("Use QElapsedTimer instead") int restart(); + QT_DEPRECATED_X("Use QElapsedTimer instead") int elapsed() const; +#endif private: enum TimeFlag { NullTime = -1 }; Q_DECL_CONSTEXPR inline int ds() const { return mds == -1 ? 0 : mds; } -- cgit v1.2.3 From de752e8994220639b2934b769e83bab0e56a00c9 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 3 Jun 2019 23:03:30 +0200 Subject: QLatin1Char: add comparison operators with char When QT_NO_CAST_FROM_ASCII is in effect, `char == QLatinChar` no longer compiles, because the QChar(char) ctor has become private. Fix by supplying the missing mixed-type operators. [ChangeLog][QtCore][QLatin1Char] Comparison against char now works even in QT_NO_CAST_FROM_ASCII builds. Change-Id: I86f5ec8e2ddfcda72f5928086cb298bd00b42544 Reviewed-by: Thiago Macieira --- src/corelib/tools/qchar.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qchar.h b/src/corelib/tools/qchar.h index be344838ed..73344ecf52 100644 --- a/src/corelib/tools/qchar.h +++ b/src/corelib/tools/qchar.h @@ -58,6 +58,19 @@ private: char ch; }; +Q_DECL_CONSTEXPR inline bool operator==(char lhs, QLatin1Char rhs) noexcept { return lhs == rhs.toLatin1(); } +Q_DECL_CONSTEXPR inline bool operator!=(char lhs, QLatin1Char rhs) noexcept { return lhs != rhs.toLatin1(); } +Q_DECL_CONSTEXPR inline bool operator<=(char lhs, QLatin1Char rhs) noexcept { return lhs <= rhs.toLatin1(); } +Q_DECL_CONSTEXPR inline bool operator>=(char lhs, QLatin1Char rhs) noexcept { return lhs >= rhs.toLatin1(); } +Q_DECL_CONSTEXPR inline bool operator< (char lhs, QLatin1Char rhs) noexcept { return lhs < rhs.toLatin1(); } +Q_DECL_CONSTEXPR inline bool operator> (char lhs, QLatin1Char rhs) noexcept { return lhs > rhs.toLatin1(); } + +Q_DECL_CONSTEXPR inline bool operator==(QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() == rhs; } +Q_DECL_CONSTEXPR inline bool operator!=(QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() != rhs; } +Q_DECL_CONSTEXPR inline bool operator<=(QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() <= rhs; } +Q_DECL_CONSTEXPR inline bool operator>=(QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() >= rhs; } +Q_DECL_CONSTEXPR inline bool operator< (QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() < rhs; } +Q_DECL_CONSTEXPR inline bool operator> (QLatin1Char lhs, char rhs) noexcept { return lhs.toLatin1() > rhs; } class Q_CORE_EXPORT QChar { public: -- cgit v1.2.3 From a76ae0a631c8387bc96ec7d358e14f6c86b73f35 Mon Sep 17 00:00:00 2001 From: Mikhail Svetkin Date: Tue, 20 Mar 2018 14:20:23 +0100 Subject: rtems: Fix build sha3 (undef ALIGN) ALIGN macro exists in RTEMS system headers and in sha3 library. Change-Id: I00cbb5be5598a6a6ca1f011f199da62d658ef9d5 Reviewed-by: Ryan Chu --- src/corelib/tools/qcryptographichash.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qcryptographichash.cpp b/src/corelib/tools/qcryptographichash.cpp index 3c79bb797d..ee7657789c 100644 --- a/src/corelib/tools/qcryptographichash.cpp +++ b/src/corelib/tools/qcryptographichash.cpp @@ -58,6 +58,10 @@ typedef unsigned char BitSequence; typedef unsigned long long DataLength; typedef enum { SUCCESS = 0, FAIL = 1, BAD_HASHLEN = 2 } HashReturn; +#ifdef Q_OS_RTEMS +# undef ALIGN +#endif + #include "../../3rdparty/sha3/KeccakSponge.c" typedef spongeState hashState; -- cgit v1.2.3 From 3619e87ba1c0b11b8406fee3e1fe5c1e96abb7ef Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Tue, 4 Jun 2019 19:49:12 +0200 Subject: Fix a minor grammar glitch in new string / byte-array doc note Amends 8845caa057cfcf54f7d46621adb3393c13747ffb. Change-Id: I4bf09b9c1fff52815de58070fbe4ff0c08eff53f Reviewed-by: Marc Mutz Reviewed-by: Thiago Macieira --- src/corelib/tools/qbytearray.cpp | 2 +- src/corelib/tools/qstring.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qbytearray.cpp b/src/corelib/tools/qbytearray.cpp index 5c2af7e058..9526350126 100644 --- a/src/corelib/tools/qbytearray.cpp +++ b/src/corelib/tools/qbytearray.cpp @@ -1439,7 +1439,7 @@ QByteArray &QByteArray::operator=(const char *str) \note Before Qt 5.14 it was possible to use this operator to access a character at an out-of-bounds position in the byte array, and - then assign to such position, causing the byte array to be + then assign to such a position, causing the byte array to be automatically resized. Furthermore, assigning a value to the returned QByteRef would cause a detach of the byte array, even if the byte array has been copied in the meanwhile (and the QByteRef kept diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index 06636098af..963c2a4d34 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -5800,7 +5800,7 @@ QString QString::trimmed_helper(QString &str) \note Before Qt 5.14 it was possible to use this operator to access a character at an out-of-bounds position in the string, and - then assign to such position, causing the string to be + then assign to such a position, causing the string to be automatically resized. Furthermore, assigning a value to the returned QCharRef would cause a detach of the string, even if the string has been copied in the meanwhile (and the QCharRef kept -- cgit v1.2.3 From 638f2749a052a22622de5ab01dfe3913644c2c25 Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Thu, 11 Apr 2019 15:57:59 +0300 Subject: QLatin1String, QStringView: add contains [ChangeLog][QtCore][QLatin1String] Added contains(). [ChangeLog][QtCore][QStringView] Added contains(). Change-Id: I19fd2e155180edd8620c520f4e60a1f86f0603ac Reviewed-by: Marc Mutz --- src/corelib/tools/qstring.cpp | 51 +++++++++++++++++++++++++++++++++++++-- src/corelib/tools/qstring.h | 29 +++++++++++++++++++--- src/corelib/tools/qstringview.cpp | 15 ++++++++++++ src/corelib/tools/qstringview.h | 6 +++++ 4 files changed, 96 insertions(+), 5 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index aa602559fe..06636098af 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -4273,7 +4273,7 @@ int QString::count(const QStringRef &str, Qt::CaseSensitivity cs) const return int(qt_string_count(QStringView(unicode(), size()), QStringView(str.unicode(), str.size()), cs)); } - +#if QT_STRINGVIEW_LEVEL < 2 /*! \fn bool QString::contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Returns \c true if this string contains an occurrence of the string @@ -4287,6 +4287,7 @@ int QString::count(const QStringRef &str, Qt::CaseSensitivity cs) const \sa indexOf(), count() */ +#endif // QT_STRINGVIEW_LEVEL < 2 /*! \fn bool QString::contains(QLatin1String str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const \since 5.3 @@ -4305,6 +4306,7 @@ int QString::count(const QStringRef &str, Qt::CaseSensitivity cs) const character \a ch; otherwise returns \c false. */ +#if QT_STRINGVIEW_LEVEL < 2 /*! \fn bool QString::contains(const QStringRef &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const \since 4.8 @@ -4316,6 +4318,20 @@ int QString::count(const QStringRef &str, Qt::CaseSensitivity cs) const \sa indexOf(), count() */ +#endif // QT_STRINGVIEW_LEVEL < 2 + +/*! \fn bool QString::contains(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const + \since 5.14 + \overload contains() + + Returns \c true if this string contains an occurrence of the string view + \a str; otherwise returns \c false. + + If \a cs is Qt::CaseSensitive (default), the search is + case sensitive; otherwise the search is case insensitive. + + \sa indexOf(), count() +*/ /*! \fn bool QString::contains(const QRegExp &rx) const @@ -9530,6 +9546,21 @@ QString &QString::setRawData(const QChar *unicode, int size) \sa QString::indexOf() */ +/*! + \fn bool QLatin1String::contains(QStringView str, Qt::CaseSensitivity cs) const + \fn bool QLatin1String::contains(QLatin1String l1, Qt::CaseSensitivity cs) const + \fn bool QLatin1String::contains(QChar c, Qt::CaseSensitivity cs) const + \since 5.14 + + Returns \c true if this Latin-1 string contains an occurrence of the string-view + \a str, Latin-1 string \a l1, or character \a ch; otherwise returns \c false. + + If \a cs is Qt::CaseSensitive (the default), the search is + case-sensitive; otherwise the search is case-insensitive. + + \sa indexOf(), QStringView::contains(), QStringView::indexOf(), QString::indexOf() +*/ + /*! \fn QLatin1String::const_iterator QLatin1String::begin() const \since 5.10 @@ -11514,7 +11545,7 @@ bool QStringRef::endsWith(const QStringRef &str, Qt::CaseSensitivity cs) const return qt_ends_with(*this, str, cs); } - +#if QT_STRINGVIEW_LEVEL < 2 /*! \fn bool QStringRef::contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const \since 4.8 @@ -11526,6 +11557,7 @@ bool QStringRef::endsWith(const QStringRef &str, Qt::CaseSensitivity cs) const \sa indexOf(), count() */ +#endif // QT_STRINGVIEW_LEVEL < 2 /*! \fn bool QStringRef::contains(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) const @@ -11540,6 +11572,7 @@ bool QStringRef::endsWith(const QStringRef &str, Qt::CaseSensitivity cs) const */ +#if QT_STRINGVIEW_LEVEL < 2 /*! \fn bool QStringRef::contains(const QStringRef &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const \overload contains() \since 4.8 @@ -11552,6 +11585,7 @@ bool QStringRef::endsWith(const QStringRef &str, Qt::CaseSensitivity cs) const \sa indexOf(), count() */ +#endif // QT_STRINGVIEW_LEVEL < 2 /*! \fn bool QStringRef::contains(QLatin1String str, Qt::CaseSensitivity cs) const \since 4.8 @@ -11566,6 +11600,19 @@ bool QStringRef::endsWith(const QStringRef &str, Qt::CaseSensitivity cs) const \sa indexOf(), count() */ +/*! \fn bool QStringRef::contains(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const + \since 5.14 + \overload contains() + + Returns \c true if this string reference contains an occurrence of + the string view \a str; otherwise returns \c false. + + If \a cs is Qt::CaseSensitive (default), the search is + case sensitive; otherwise the search is case insensitive. + + \sa indexOf(), count() +*/ + static inline qsizetype qt_last_index_of(QStringView haystack, QChar needle, qsizetype from, Qt::CaseSensitivity cs) { diff --git a/src/corelib/tools/qstring.h b/src/corelib/tools/qstring.h index 0f7b015bef..da8260a999 100644 --- a/src/corelib/tools/qstring.h +++ b/src/corelib/tools/qstring.h @@ -138,6 +138,13 @@ public: Q_REQUIRED_RESULT inline int indexOf(QChar c, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept { return int(QtPrivate::findString(*this, from, QStringView(&c, 1), cs)); } // ### Qt6: qsize + Q_REQUIRED_RESULT bool contains(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept + { return indexOf(s, 0, cs) != -1; } + Q_REQUIRED_RESULT bool contains(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept + { return indexOf(s, 0, cs) != -1; } + Q_REQUIRED_RESULT inline bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept + { return indexOf(QStringView(&c, 1), 0, cs) != -1; } + using value_type = const char; using reference = value_type&; using const_reference = reference; @@ -224,6 +231,8 @@ bool QStringView::endsWith(QLatin1String s, Qt::CaseSensitivity cs) const noexce { return QtPrivate::endsWith(*this, s, cs); } qsizetype QStringView::indexOf(QLatin1String s, qsizetype from, Qt::CaseSensitivity cs) const noexcept { return QtPrivate::findString(*this, from, s, cs); } +bool QStringView::contains(QLatin1String s, Qt::CaseSensitivity cs) const noexcept +{ return indexOf(s, 0, cs) != qsizetype(-1); } class Q_CORE_EXPORT QString { @@ -351,9 +360,12 @@ public: int lastIndexOf(const QStringRef &s, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; inline bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; +#if QT_STRINGVIEW_LEVEL < 2 inline bool contains(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; - inline bool contains(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; inline bool contains(const QStringRef &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; +#endif + inline bool contains(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; + inline bool contains(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept; int count(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; int count(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; int count(const QStringRef &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; @@ -1240,14 +1252,18 @@ inline QString::const_iterator QString::cend() const { return reinterpret_cast(d->data() + d->size); } inline QString::const_iterator QString::constEnd() const { return reinterpret_cast(d->data() + d->size); } +#if QT_STRINGVIEW_LEVEL < 2 inline bool QString::contains(const QString &s, Qt::CaseSensitivity cs) const { return indexOf(s, 0, cs) != -1; } inline bool QString::contains(const QStringRef &s, Qt::CaseSensitivity cs) const { return indexOf(s, 0, cs) != -1; } +#endif inline bool QString::contains(QLatin1String s, Qt::CaseSensitivity cs) const { return indexOf(s, 0, cs) != -1; } inline bool QString::contains(QChar c, Qt::CaseSensitivity cs) const { return indexOf(c, 0, cs) != -1; } +inline bool QString::contains(QStringView s, Qt::CaseSensitivity cs) const noexcept +{ return indexOf(s, 0, cs) != -1; } #if QT_DEPRECATED_SINCE(5, 9) inline bool operator==(QString::Null, QString::Null) { return true; } @@ -1528,10 +1544,13 @@ public: int lastIndexOf(QLatin1String str, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; int lastIndexOf(const QStringRef &str, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; +#if QT_STRINGVIEW_LEVEL < 2 inline bool contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; + inline bool contains(const QStringRef &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; +#endif inline bool contains(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; inline bool contains(QLatin1String str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; - inline bool contains(const QStringRef &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; + inline bool contains(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept; int count(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; int count(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; @@ -1893,13 +1912,17 @@ inline int QStringRef::localeAwareCompare(const QStringRef &s1, const QString &s inline int QStringRef::localeAwareCompare(const QStringRef &s1, const QStringRef &s2) { return QString::localeAwareCompare_helper(s1.constData(), s1.length(), s2.constData(), s2.length()); } +#if QT_STRINGVIEW_LEVEL < 2 inline bool QStringRef::contains(const QString &s, Qt::CaseSensitivity cs) const { return indexOf(s, 0, cs) != -1; } +inline bool QStringRef::contains(const QStringRef &s, Qt::CaseSensitivity cs) const +{ return indexOf(s, 0, cs) != -1; } +#endif inline bool QStringRef::contains(QLatin1String s, Qt::CaseSensitivity cs) const { return indexOf(s, 0, cs) != -1; } inline bool QStringRef::contains(QChar c, Qt::CaseSensitivity cs) const { return indexOf(c, 0, cs) != -1; } -inline bool QStringRef::contains(const QStringRef &s, Qt::CaseSensitivity cs) const +inline bool QStringRef::contains(QStringView s, Qt::CaseSensitivity cs) const noexcept { return indexOf(s, 0, cs) != -1; } inline QString &QString::insert(int i, const QStringRef &s) diff --git a/src/corelib/tools/qstringview.cpp b/src/corelib/tools/qstringview.cpp index 8c2b52ea09..050097b443 100644 --- a/src/corelib/tools/qstringview.cpp +++ b/src/corelib/tools/qstringview.cpp @@ -739,6 +739,21 @@ QT_BEGIN_NAMESPACE \sa QString::indexOf() */ +/*! + \fn bool QStringView::contains(QStringView str, Qt::CaseSensitivity cs) const + \fn bool QStringView::contains(QLatin1String l1, Qt::CaseSensitivity cs) const + \fn bool QStringView::contains(QChar c, Qt::CaseSensitivity cs) const + \since 5.14 + + Returns \c true if this string-view contains an occurrence of the string-view + \a str, Latin-1 string \a l1, or character \a ch; otherwise returns \c false. + + If \a cs is Qt::CaseSensitive (the default), the search is + case-sensitive; otherwise the search is case-insensitive. + + \sa indexOf() +*/ + /*! \fn QByteArray QStringView::toLatin1() const diff --git a/src/corelib/tools/qstringview.h b/src/corelib/tools/qstringview.h index bbf51b24f6..2c93b31385 100644 --- a/src/corelib/tools/qstringview.h +++ b/src/corelib/tools/qstringview.h @@ -276,6 +276,12 @@ public: { return QtPrivate::findString(*this, from, s, cs); } Q_REQUIRED_RESULT inline qsizetype indexOf(QLatin1String s, qsizetype from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept; + Q_REQUIRED_RESULT bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept + { return indexOf(QStringView(&c, 1), 0, cs) != qsizetype(-1); } + Q_REQUIRED_RESULT bool contains(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept + { return indexOf(s, 0, cs) != qsizetype(-1); } + Q_REQUIRED_RESULT inline bool contains(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const noexcept; + Q_REQUIRED_RESULT bool isRightToLeft() const noexcept { return QtPrivate::isRightToLeft(*this); } -- cgit v1.2.3 From b3c52e82245f46af9ce633a6de1e4e41fb9f3f6d Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Sun, 10 Feb 2019 18:43:05 +0100 Subject: Simplify {to,from}Std{List,Vector} Use the newly-added range constructors. Change-Id: I7f1d2699d88656fb7dddd11a9d781d810d45b0b4 Reviewed-by: Marc Mutz --- src/corelib/tools/qlist.h | 15 ++++----------- src/corelib/tools/qvector.h | 2 +- 2 files changed, 5 insertions(+), 12 deletions(-) (limited to 'src/corelib/tools') diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index 04c1f12f5f..70bbc11ad2 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -414,10 +414,10 @@ public: Q_DECL_DEPRECATED_X("Use QList(list.begin(), list.end()) instead.") static inline QList fromStdList(const std::list &list) - { QList tmp; std::copy(list.begin(), list.end(), std::back_inserter(tmp)); return tmp; } + { return QList(list.begin(), list.end()); } Q_DECL_DEPRECATED_X("Use std::list(list.begin(), list.end()) instead.") inline std::list toStdList() const - { std::list tmp; std::copy(constBegin(), constEnd(), std::back_inserter(tmp)); return tmp; } + { return std::list(begin(), end()); } #endif private: @@ -1105,10 +1105,7 @@ inline int QList::count_impl(const T &t, QListData::ArrayCompatibleLayout) co template Q_OUTOFLINE_TEMPLATE QVector QList::toVector() const { - QVector result(size()); - for (int i = 0; i < size(); ++i) - result[i] = at(i); - return result; + return QVector(begin(), end()); } template @@ -1120,11 +1117,7 @@ QList QList::fromVector(const QVector &vector) template Q_OUTOFLINE_TEMPLATE QList QVector::toList() const { - QList result; - result.reserve(size()); - for (int i = 0; i < size(); ++i) - result.append(at(i)); - return result; + return QList(begin(), end()); } template diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h index c223e4efa0..5d68a283bd 100644 --- a/src/corelib/tools/qvector.h +++ b/src/corelib/tools/qvector.h @@ -303,7 +303,7 @@ public: #if QT_VERSION < QT_VERSION_CHECK(6,0,0) Q_DECL_DEPRECATED_X("Use QVector(vector.begin(), vector.end()) instead.") static inline QVector fromStdVector(const std::vector &vector) - { QVector tmp; tmp.reserve(int(vector.size())); std::copy(vector.begin(), vector.end(), std::back_inserter(tmp)); return tmp; } + { return QVector(vector.begin(), vector.end()); } Q_DECL_DEPRECATED_X("Use std::vector(vector.begin(), vector.end()) instead.") inline std::vector toStdVector() const { return std::vector(d->begin(), d->end()); } -- cgit v1.2.3